diff --git a/examples/http_redirect.py b/examples/http_redirect.py index b13ee8bd..f3f176fc 100644 --- a/examples/http_redirect.py +++ b/examples/http_redirect.py @@ -35,9 +35,7 @@ def proxy(request, path): @https.main_process_start async def start(app, _): - http_server = await http.create_server( - port=HTTP_PORT, return_asyncio_server=True - ) + http_server = await http.create_server(port=HTTP_PORT, return_asyncio_server=True) app.add_task(runner(http, http_server)) app.ctx.http_server = http_server app.ctx.http = http diff --git a/examples/logdna_example.py b/examples/logdna_example.py index 9dc9ee40..f942a796 100644 --- a/examples/logdna_example.py +++ b/examples/logdna_example.py @@ -33,9 +33,7 @@ logdna_options = { "mac": get_mac_address(), } -logdna_handler = LogDNAHandler( - getenv("LOGDNA_API_KEY"), options=logdna_options -) +logdna_handler = LogDNAHandler(getenv("LOGDNA_API_KEY"), options=logdna_options) logdna = logging.getLogger(__name__) logdna.setLevel(logging.INFO) diff --git a/examples/run_asgi.py b/examples/run_asgi.py index 81a7cd8a..aedc1039 100644 --- a/examples/run_asgi.py +++ b/examples/run_asgi.py @@ -42,9 +42,7 @@ async def handler_file(request): @app.route("/file_stream") async def handler_file_stream(request): - return await response.file_stream( - Path("../") / "setup.py", chunk_size=1024 - ) + return await response.file_stream(Path("../") / "setup.py", chunk_size=1024) @app.post("/stream", stream=True) diff --git a/examples/run_async_advanced.py b/examples/run_async_advanced.py index fa8ffec6..e9cb8805 100644 --- a/examples/run_async_advanced.py +++ b/examples/run_async_advanced.py @@ -36,9 +36,7 @@ async def test(request): if __name__ == "__main__": asyncio.set_event_loop(uvloop.new_event_loop()) - serv_coro = app.create_server( - host="0.0.0.0", port=8000, return_asyncio_server=True - ) + serv_coro = app.create_server(host="0.0.0.0", port=8000, return_asyncio_server=True) loop = asyncio.get_event_loop() serv_task = asyncio.ensure_future(serv_coro, loop=loop) signal(SIGINT, lambda s, f: loop.stop()) diff --git a/examples/try_everything.py b/examples/try_everything.py index 6020388d..211f0389 100644 --- a/examples/try_everything.py +++ b/examples/try_everything.py @@ -42,9 +42,7 @@ async def test_file(request): @app.route("/file_stream") async def test_file_stream(request): - return await response.file_stream( - os.path.abspath("setup.py"), chunk_size=1024 - ) + return await response.file_stream(os.path.abspath("setup.py"), chunk_size=1024) # ----------------------------------------------- # diff --git a/examples/vhosts.py b/examples/vhosts.py index 0c3482e4..bbac0f31 100644 --- a/examples/vhosts.py +++ b/examples/vhosts.py @@ -11,9 +11,7 @@ app = Sanic("Example") bp = Blueprint("bp", host="bp.example.com") -@app.route( - "/", host=["example.com", "somethingelse.com", "therestofyourdomains.com"] -) +@app.route("/", host=["example.com", "somethingelse.com", "therestofyourdomains.com"]) async def hello_0(request): return response.text("Some defaults") diff --git a/guide/content/en/migrate.py b/guide/content/en/migrate.py index e0510af4..5850597f 100644 --- a/guide/content/en/migrate.py +++ b/guide/content/en/migrate.py @@ -7,14 +7,10 @@ from emoji import EMOJI COLUMN_PATTERN = re.compile(r"---:1\s*(.*?)\s*:--:1\s*(.*?)\s*:---", re.DOTALL) PYTHON_HIGHLIGHT_PATTERN = re.compile(r"```python\{+.*?\}", re.DOTALL) BASH_HIGHLIGHT_PATTERN = re.compile(r"```bash\{+.*?\}", re.DOTALL) -NOTIFICATION_PATTERN = re.compile( - r":::\s*(\w+)\s*(.*?)\n([\s\S]*?):::", re.MULTILINE -) +NOTIFICATION_PATTERN = re.compile(r":::\s*(\w+)\s*(.*?)\n([\s\S]*?):::", re.MULTILINE) EMOJI_PATTERN = re.compile(r":(\w+):") CURRENT_DIR = Path(__file__).parent -SOURCE_DIR = ( - CURRENT_DIR.parent.parent.parent.parent / "sanic-guide" / "src" / "en" -) +SOURCE_DIR = CURRENT_DIR.parent.parent.parent.parent / "sanic-guide" / "src" / "en" def convert_columns(content: str): diff --git a/guide/webapp/display/layouts/elements/footer.py b/guide/webapp/display/layouts/elements/footer.py index 4ef2051a..f5545580 100644 --- a/guide/webapp/display/layouts/elements/footer.py +++ b/guide/webapp/display/layouts/elements/footer.py @@ -13,9 +13,7 @@ def do_footer(builder: Builder, request: Request) -> None: def _pagination(request: Request) -> Builder: - return E.div( - _pagination_left(request), _pagination_right(request), class_="level" - ) + return E.div(_pagination_left(request), _pagination_right(request), class_="level") def _pagination_left(request: Request) -> Builder: @@ -64,9 +62,7 @@ def _content() -> Builder: href="https://github.com/sanic-org/sanic/blob/master/LICENSE", target="_blank", rel="nofollow noopener noreferrer", - ).br()( - E.small(f"Copyright © 2018-{year} Sanic Community Organization") - ), + ).br()(E.small(f"Copyright © 2018-{year} Sanic Community Organization")), ) return E.div( inner, diff --git a/guide/webapp/display/layouts/elements/navbar.py b/guide/webapp/display/layouts/elements/navbar.py index 5581e4a6..3bb1810d 100644 --- a/guide/webapp/display/layouts/elements/navbar.py +++ b/guide/webapp/display/layouts/elements/navbar.py @@ -6,12 +6,9 @@ from webapp.display.layouts.models import MenuItem def do_navbar(builder: Builder, request: Request) -> None: navbar_items = [ - _render_navbar_item(item, request) - for item in request.app.config.NAVBAR + _render_navbar_item(item, request) for item in request.app.config.NAVBAR ] - container = E.div( - _search_form(request), *navbar_items, class_="navbar-end" - ) + container = E.div(_search_form(request), *navbar_items, class_="navbar-end") builder.nav( E.div(container, class_="navbar-menu"), @@ -46,10 +43,7 @@ def _render_navbar_item(item: MenuItem, request: Request) -> Builder: return E.div( E.a(item.label, class_="navbar-link"), E.div( - *( - _render_navbar_item(subitem, request) - for subitem in item.items - ), + *(_render_navbar_item(subitem, request) for subitem in item.items), class_="navbar-dropdown", ), class_="navbar-item has-dropdown is-hoverable", diff --git a/guide/webapp/display/layouts/elements/sidebar.py b/guide/webapp/display/layouts/elements/sidebar.py index 72a04082..60a07e37 100644 --- a/guide/webapp/display/layouts/elements/sidebar.py +++ b/guide/webapp/display/layouts/elements/sidebar.py @@ -15,9 +15,7 @@ def _menu_items(request: Request) -> list[Builder]: _sanic_logo(request), *_sidebar_items(request), E.hr(), - E.p("Current with version ").strong( - request.app.config.GENERAL.current_version - ), + E.p("Current with version ").strong(request.app.config.GENERAL.current_version), E.hr(), E.p("Want more? ").a( "sanicbook.com", href="https://sanicbook.com", target="_blank" @@ -73,9 +71,7 @@ def _single_sidebar_item(item: MenuItem, request: Request) -> Builder: kwargs = {} classes: list[str] = [] li_classes = "menu-item" - _, page, _ = request.app.ctx.get_page( - request.ctx.language, item.path or "" - ) + _, page, _ = request.app.ctx.get_page(request.ctx.language, item.path or "") if request.path == path: classes.append("is-active") if item.href: diff --git a/guide/webapp/display/markdown.py b/guide/webapp/display/markdown.py index eb76cb81..2236dda6 100644 --- a/guide/webapp/display/markdown.py +++ b/guide/webapp/display/markdown.py @@ -36,9 +36,9 @@ class DocsRenderer(HTMLRenderer): class_="code-block__copy", onclick="copyCode(this)", ): - builder.div( - class_="code-block__rectangle code-block__filled" - ).div(class_="code-block__rectangle code-block__outlined") + builder.div(class_="code-block__rectangle code-block__filled").div( + class_="code-block__rectangle code-block__outlined" + ) else: builder.pre(E.code(escape(code))) return str(builder) @@ -46,9 +46,7 @@ class DocsRenderer(HTMLRenderer): def heading(self, text: str, level: int, **attrs) -> str: ident = slugify(text) if level > 1: - text += self._make_tag( - "a", {"href": f"#{ident}", "class": "anchor"}, "#" - ) + text += self._make_tag("a", {"href": f"#{ident}", "class": "anchor"}, "#") return self._make_tag( f"h{level}", {"id": ident, "class": f"is-size-{level}"}, text ) @@ -92,9 +90,7 @@ class DocsRenderer(HTMLRenderer): def _make_tag( self, tag: str, attributes: dict[str, str], text: str | None = None ) -> str: - attrs = " ".join( - f'{key}="{value}"' for key, value in attributes.items() - ) + attrs = " ".join(f'{key}="{value}"' for key, value in attributes.items()) if text is None: return f"<{tag} {attrs} />" return f"<{tag} {attrs}>{text}" diff --git a/guide/webapp/display/page/docobject.py b/guide/webapp/display/page/docobject.py index e35f90fd..c09cd1ca 100644 --- a/guide/webapp/display/page/docobject.py +++ b/guide/webapp/display/page/docobject.py @@ -119,9 +119,7 @@ def _extract_docobjects(package_name: str) -> dict[str, DocObject]: docstrings = {} package = importlib.import_module(package_name) - for _, name, _ in pkgutil.walk_packages( - package.__path__, package_name + "." - ): + for _, name, _ in pkgutil.walk_packages(package.__path__, package_name + "."): module = importlib.import_module(name) for obj_name, obj in inspect.getmembers(module): if ( @@ -155,9 +153,7 @@ def _docobject_to_html( ) -> None: anchor_id = slugify(docobject.full_name.replace(".", "-")) anchor = E.a("#", class_="anchor", href=f"#{anchor_id}") - class_name, heading = _define_heading_and_class( - docobject, anchor, as_method - ) + class_name, heading = _define_heading_and_class(docobject, anchor, as_method) with builder.div(class_=class_name): builder(heading) @@ -211,9 +207,7 @@ def _docobject_to_html( if docobject.docstring.params: with builder.div(class_="box mt-5"): - builder.h5( - "Parameters", class_="is-size-5 has-text-weight-bold" - ) + builder.h5("Parameters", class_="is-size-5 has-text-weight-bold") _render_params(builder, docobject.docstring.params) if docobject.docstring.returns: @@ -238,9 +232,7 @@ def _signature_to_html( parts = [] parts.append("") for decorator in decorators: - parts.append( - f"@{decorator}
" - ) + parts.append(f"@{decorator}
") parts.append( f"{object_type} " f"{name}(" @@ -254,9 +246,7 @@ def _signature_to_html( annotation = "" if param.annotation != inspect.Parameter.empty: annotation = escape(str(param.annotation)) - parts.append( - f": {annotation}" - ) + parts.append(f": {annotation}") if param.default != inspect.Parameter.empty: default = escape(str(param.default)) if annotation == "str": @@ -267,9 +257,7 @@ def _signature_to_html( parts.append(")") if signature.return_annotation != inspect.Signature.empty: return_annotation = escape(str(signature.return_annotation)) - parts.append( - f": -> {return_annotation}" - ) + parts.append(f": -> {return_annotation}") parts.append("
") return "".join(parts) @@ -317,10 +305,7 @@ def _render_params(builder: Builder, params: list[DocstringParam]) -> None: builder.dd( HTML( render_markdown( - param.description - or param.arg_name - or param.type_name - or "" + param.description or param.arg_name or param.type_name or "" ) ) ) @@ -333,11 +318,7 @@ def _render_raises(builder: Builder, raises: list[DocstringRaises]) -> None: with builder.dl(class_="mt-2"): builder.dt(raise_.type_name, class_="is-family-monospace") builder.dd( - HTML( - render_markdown( - raise_.description or raise_.type_name or "" - ) - ) + HTML(render_markdown(raise_.description or raise_.type_name or "")) ) @@ -353,11 +334,7 @@ def _render_returns(builder: Builder, docobject: DocObject) -> None: if not return_type or return_type == inspect.Signature.empty: return_type = "N/A" - term = ( - "Return" - if not docobject.docstring.returns.is_generator - else "Yields" - ) + term = "Return" if not docobject.docstring.returns.is_generator else "Yields" builder.h5(term, class_="is-size-5 has-text-weight-bold") with builder.dl(class_="mt-2"): builder.dt(return_type, class_="is-family-monospace") @@ -372,17 +349,11 @@ def _render_returns(builder: Builder, docobject: DocObject) -> None: ) -def _render_examples( - builder: Builder, examples: list[DocstringExample] -) -> None: +def _render_examples(builder: Builder, examples: list[DocstringExample]) -> None: with builder.div(class_="box mt-5"): builder.h5("Examples", class_="is-size-5 has-text-weight-bold") for example in examples: with builder.div(class_="mt-2"): builder( - HTML( - render_markdown( - example.description or example.snippet or "" - ) - ) + HTML(render_markdown(example.description or example.snippet or "")) ) diff --git a/guide/webapp/display/page/page.py b/guide/webapp/display/page/page.py index a2c9d4cb..3c168f9e 100644 --- a/guide/webapp/display/page/page.py +++ b/guide/webapp/display/page/page.py @@ -11,9 +11,7 @@ from ..layouts.main import MainLayout from ..markdown import render_markdown from .docobject import organize_docobjects -_PAGE_CACHE: dict[ - str, dict[str, tuple[Page | None, Page | None, Page | None]] -] = {} +_PAGE_CACHE: dict[str, dict[str, tuple[Page | None, Page | None, Page | None]]] = {} _LAYOUTS_CACHE: dict[str, type[BaseLayout]] = { "home": HomeLayout, "main": MainLayout, diff --git a/guide/webapp/display/page/renderer.py b/guide/webapp/display/page/renderer.py index 987aa3c7..370a4c8c 100644 --- a/guide/webapp/display/page/renderer.py +++ b/guide/webapp/display/page/renderer.py @@ -20,13 +20,9 @@ class PageRenderer(BaseRenderer): self._body(request, builder, language, path) return builder - def _body( - self, request: Request, builder: Builder, language: str, path: str - ): + def _body(self, request: Request, builder: Builder, language: str, path: str): prev_page, current_page, next_page = Page.get(language, path) - request.ctx.language = ( - Page.DEFAULT_LANGUAGE if language == "api" else language - ) + request.ctx.language = Page.DEFAULT_LANGUAGE if language == "api" else language request.ctx.current_page = current_page request.ctx.previous_page = prev_page request.ctx.next_page = next_page @@ -38,9 +34,7 @@ class PageRenderer(BaseRenderer): @contextmanager def _base(self, request: Request, builder: Builder, page: Page | None): - layout_type: type[BaseLayout] = ( - page.get_layout() if page else BaseLayout - ) + layout_type: type[BaseLayout] = page.get_layout() if page else BaseLayout layout = layout_type(builder) with layout(request, builder.full): yield diff --git a/guide/webapp/display/plugins/attrs.py b/guide/webapp/display/plugins/attrs.py index f2f33363..d605ba41 100644 --- a/guide/webapp/display/plugins/attrs.py +++ b/guide/webapp/display/plugins/attrs.py @@ -15,9 +15,7 @@ class Attributes(DirectivePlugin): if md.renderer.NAME == "html": md.renderer.register("attrs", self._render) - def parse( - self, block: BlockParser, m: Match, state: BlockState - ) -> dict[str, Any]: + def parse(self, block: BlockParser, m: Match, state: BlockState) -> dict[str, Any]: info = m.groupdict() options = dict(self.parse_options(m)) new_state = block.state_cls() diff --git a/guide/webapp/display/plugins/columns.py b/guide/webapp/display/plugins/columns.py index 4ab7feab..7e448e8e 100644 --- a/guide/webapp/display/plugins/columns.py +++ b/guide/webapp/display/plugins/columns.py @@ -10,9 +10,7 @@ from mistune.markdown import Markdown class Column(DirectivePlugin): - def parse( - self, block: BlockParser, m: Match, state: BlockState - ) -> dict[str, Any]: + def parse(self, block: BlockParser, m: Match, state: BlockState) -> dict[str, Any]: info = m.groupdict() new_state = block.state_cls() @@ -36,9 +34,7 @@ class Column(DirectivePlugin): def _render_column(self, renderer: HTMLRenderer, text: str, **attrs): start = ( - '
\n' - if attrs.get("first") - else "" + '
\n' if attrs.get("first") else "" ) end = "
\n" if attrs.get("last") else "" col = f'
{text}
\n' diff --git a/guide/webapp/display/plugins/hook.py b/guide/webapp/display/plugins/hook.py index db1b647a..e0ff1295 100644 --- a/guide/webapp/display/plugins/hook.py +++ b/guide/webapp/display/plugins/hook.py @@ -16,16 +16,12 @@ class Hook(DirectivePlugin): for type_ in ("column", "tab"): if token["type"] == type_: maybe_next = ( - state.tokens[idx + 1] - if idx + 1 < len(state.tokens) - else None + state.tokens[idx + 1] if idx + 1 < len(state.tokens) else None ) token.setdefault("attrs", {}) if prev and prev["type"] != type_: token["attrs"]["first"] = True - if ( - maybe_next and maybe_next["type"] != type_ - ) or not maybe_next: + if (maybe_next and maybe_next["type"] != type_) or not maybe_next: token["attrs"]["last"] = True prev = token diff --git a/guide/webapp/display/plugins/mermaid.py b/guide/webapp/display/plugins/mermaid.py index 935aae44..b814b812 100644 --- a/guide/webapp/display/plugins/mermaid.py +++ b/guide/webapp/display/plugins/mermaid.py @@ -12,9 +12,7 @@ from mistune.markdown import Markdown class Mermaid(DirectivePlugin): - def parse( - self, block: BlockParser, m: Match, state: BlockState - ) -> dict[str, Any]: + def parse(self, block: BlockParser, m: Match, state: BlockState) -> dict[str, Any]: info = m.groupdict() new_state = block.state_cls() diff --git a/guide/webapp/display/plugins/notification.py b/guide/webapp/display/plugins/notification.py index 15b0689f..aaf8a338 100644 --- a/guide/webapp/display/plugins/notification.py +++ b/guide/webapp/display/plugins/notification.py @@ -19,12 +19,8 @@ class Notification(Admonition): if md.renderer.NAME == "html": md.renderer.register("admonition", self._render_admonition) - md.renderer.register( - "admonition_title", self._render_admonition_title - ) - md.renderer.register( - "admonition_content", self._render_admonition_content - ) + md.renderer.register("admonition_title", self._render_admonition_title) + md.renderer.register("admonition_content", self._render_admonition_content) def _render_admonition(self, _, text, name, **attrs) -> str: return str( diff --git a/guide/webapp/display/plugins/tabs.py b/guide/webapp/display/plugins/tabs.py index b99e70db..882254e9 100644 --- a/guide/webapp/display/plugins/tabs.py +++ b/guide/webapp/display/plugins/tabs.py @@ -10,9 +10,7 @@ from mistune.markdown import Markdown class Tabs(DirectivePlugin): - def parse( - self, block: BlockParser, m: Match, state: BlockState - ) -> dict[str, Any]: + def parse(self, block: BlockParser, m: Match, state: BlockState) -> dict[str, Any]: info = m.groupdict() new_state = block.state_cls() @@ -41,9 +39,7 @@ class Tabs(DirectivePlugin): def _render_tab(self, renderer: HTMLRenderer, text: str, **attrs): start = '
\n' - if attrs.get("last") - else "" + '
\n' if attrs.get("last") else "" ) content = f'
{text}
\n' tab = f'
  • {attrs["title"]}{content}
  • \n' diff --git a/guide/webapp/display/search/search.py b/guide/webapp/display/search/search.py index a8a35cb4..d84ba79b 100644 --- a/guide/webapp/display/search/search.py +++ b/guide/webapp/display/search/search.py @@ -92,9 +92,7 @@ def _inverse_document_frequency(docs: list[Document]) -> dict[str, float]: return {word: num_docs / count for word, count in word_count.items()} -def _tf_idf_vector( - document: Document, idf: dict[str, float] -) -> dict[str, float]: +def _tf_idf_vector(document: Document, idf: dict[str, float]) -> dict[str, float]: """Calculate the TF-IDF vector for a document.""" return { word: tf * idf[word] @@ -103,9 +101,7 @@ def _tf_idf_vector( } -def _cosine_similarity( - vec1: dict[str, float], vec2: dict[str, float] -) -> float: +def _cosine_similarity(vec1: dict[str, float], vec2: dict[str, float]) -> float: """Calculate the cosine similarity between two vectors.""" if not vec1 or not vec2: return 0.0 @@ -127,9 +123,7 @@ def _search( tf_idf_query = _tf_idf_vector( Document(page=dummy_page, language=language).process(stemmer), idf ) - similarities = [ - _cosine_similarity(tf_idf_query, vector) for vector in vectors - ] + similarities = [_cosine_similarity(tf_idf_query, vector) for vector in vectors] return [ (similarity, document) for similarity, document in sorted( @@ -156,16 +150,13 @@ class Searcher: } self._vectors = { language: [ - _tf_idf_vector(document, self._idf[language]) - for document in documents + _tf_idf_vector(document, self._idf[language]) for document in documents ] for language, documents in self._documents.items() } self._stemmer = stemmer - def search( - self, query: str, language: str - ) -> list[tuple[float, Document]]: + def search(self, query: str, language: str) -> list[tuple[float, Document]]: return _search( query, language, diff --git a/guide/webapp/worker/factory.py b/guide/webapp/worker/factory.py index 3f5f454e..80c98437 100644 --- a/guide/webapp/worker/factory.py +++ b/guide/webapp/worker/factory.py @@ -28,13 +28,9 @@ def create_app(root: Path) -> Sanic: app.config.STYLE_DIR = root / "style" app.config.NODE_MODULES_DIR = root / "node_modules" app.config.LANGUAGES = ["en"] - app.config.SIDEBAR = load_menu( - app.config.CONFIG_DIR / "en" / "sidebar.yaml" - ) + app.config.SIDEBAR = load_menu(app.config.CONFIG_DIR / "en" / "sidebar.yaml") app.config.NAVBAR = load_menu(app.config.CONFIG_DIR / "en" / "navbar.yaml") - app.config.GENERAL = load_config( - app.config.CONFIG_DIR / "en" / "general.yaml" - ) + app.config.GENERAL = load_config(app.config.CONFIG_DIR / "en" / "general.yaml") setup_livereload(app) setup_style(app) @@ -66,8 +62,6 @@ def create_app(root: Path) -> Sanic: @app.on_request async def set_language(request: Request): - request.ctx.language = request.match_info.get( - "language", Page.DEFAULT_LANGUAGE - ) + request.ctx.language = request.match_info.get("language", Page.DEFAULT_LANGUAGE) return app diff --git a/guide/webapp/worker/reload.py b/guide/webapp/worker/reload.py index c3adc24a..8efa7e8a 100644 --- a/guide/webapp/worker/reload.py +++ b/guide/webapp/worker/reload.py @@ -53,16 +53,12 @@ class Livereload: "serverName": SERVER_NAME, } - def __init__( - self, reload_queue: Queue, debug: bool, state: dict[str, Any] - ): + def __init__(self, reload_queue: Queue, debug: bool, state: dict[str, Any]): self.reload_queue = reload_queue self.app = Sanic(self.SERVER_NAME) self.debug = debug self.state = state - self.app.static( - "/livereload.js", Path(__file__).parent / "livereload.js" - ) + self.app.static("/livereload.js", Path(__file__).parent / "livereload.js") self.app.add_websocket_route( self.livereload_handler, "/livereload", name="livereload" ) @@ -108,7 +104,5 @@ class Livereload: break -def _run_reload_server( - reload_queue: Queue, debug: bool, state: dict[str, Any] -): +def _run_reload_server(reload_queue: Queue, debug: bool, state: dict[str, Any]): Livereload(reload_queue, debug, state).run() diff --git a/sanic/app.py b/sanic/app.py index f7c22af4..42c2024b 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -309,9 +309,7 @@ class Sanic( self.asgi = False self.auto_reload = False self.blueprints: dict[str, Blueprint] = {} - self.certloader_class: type[CertLoader] = ( - certloader_class or CertLoader - ) + self.certloader_class: type[CertLoader] = certloader_class or CertLoader self.configure_logging: bool = configure_logging self.ctx: ctx_type = cast(ctx_type, ctx or SimpleNamespace()) self.error_handler: ErrorHandler = error_handler or ErrorHandler() @@ -387,15 +385,11 @@ class Sanic( try: _event = ListenerEvent[event.upper()] except (ValueError, AttributeError): - valid = ", ".join( - x.lower() for x in ListenerEvent.__members__.keys() - ) + valid = ", ".join(x.lower() for x in ListenerEvent.__members__.keys()) raise BadRequest(f"Invalid event: {event}. Use one of: {valid}") if "." in _event: - self.signal(_event.value)( - partial(self._listener, listener=listener) - ) + self.signal(_event.value)(partial(self._listener, listener=listener)) else: self.listeners[_event.value].append(listener) @@ -522,9 +516,7 @@ class Sanic( def _apply_listener(self, listener: FutureListener): return self.register_listener(listener.listener, listener.event) - def _apply_route( - self, route: FutureRoute, overwrite: bool = False - ) -> list[Route]: + def _apply_route(self, route: FutureRoute, overwrite: bool = False) -> list[Route]: params = route._asdict() params["overwrite"] = overwrite websocket = params.pop("websocket", False) @@ -653,9 +645,7 @@ class Sanic( fail_not_found=fail_not_found, ) - async def event( - self, event: str, timeout: int | float | None = None - ) -> None: + async def event(self, event: str, timeout: int | float | None = None) -> None: """Wait for a specific event to be triggered. This method waits for a named event to be triggered and can be used @@ -740,9 +730,7 @@ class Sanic( async def report(exception: Exception) -> None: await handler(self, exception) - self.add_signal( - handler=report, event=Event.SERVER_EXCEPTION_REPORT.value - ) + self.add_signal(handler=report, event=Event.SERVER_EXCEPTION_REPORT.value) return report @@ -831,14 +819,12 @@ class Sanic( for _attr in ["version", "strict_slashes"]: if getattr(item, _attr) is None: - params[_attr] = getattr( - blueprint, _attr - ) or options.get(_attr) + params[_attr] = getattr(blueprint, _attr) or options.get( + _attr + ) if item.version_prefix == "/v": if blueprint.version_prefix == "/v": - params["version_prefix"] = options.get( - "version_prefix" - ) + params["version_prefix"] = options.get("version_prefix") else: params["version_prefix"] = blueprint.version_prefix name_prefix = getattr(blueprint, "name_prefix", None) @@ -855,10 +841,7 @@ class Sanic( self.blueprints[blueprint.name] = blueprint self._blueprint_order.append(blueprint) - if ( - self.strict_slashes is not None - and blueprint.strict_slashes is None - ): + if self.strict_slashes is not None and blueprint.strict_slashes is None: blueprint.strict_slashes = self.strict_slashes blueprint.register(self, options) @@ -928,9 +911,7 @@ class Sanic( route = self.router.find_route_by_view_name(view_name, **kw) if not route: - raise URLBuildError( - f"Endpoint with name `{view_name}` was not found" - ) + raise URLBuildError(f"Endpoint with name `{view_name}` was not found") uri = route.path @@ -969,9 +950,7 @@ class Sanic( scheme = kwargs.pop("_scheme", "") if route.extra.hosts and external: if not host and len(route.extra.hosts) > 1: - raise ValueError( - f"Host is ambiguous: {', '.join(route.extra.hosts)}" - ) + raise ValueError(f"Host is ambiguous: {', '.join(route.extra.hosts)}") elif host and host not in route.extra.hosts: raise ValueError( f"Requested host ({host}) is not available for this " @@ -1087,10 +1066,7 @@ class Sanic( context={"request": request, "exception": exception}, ) - if ( - request.stream is not None - and request.stream.stage is not Stage.HANDLER - ): + if request.stream is not None and request.stream.stage is not Stage.HANDLER: error_logger.exception(exception, exc_info=True) logger.error( "The error response will not be sent to the client for " @@ -1137,10 +1113,7 @@ class Sanic( response = self.error_handler.default(request, e) elif self.debug: response = HTTPResponse( - ( - f"Error while handling error: {e}\n" - f"Stack: {format_exc()}" - ), + (f"Error while handling error: {e}\n" f"Stack: {format_exc()}"), status=500, ) else: @@ -1185,9 +1158,7 @@ class Sanic( ) await response.eof() else: - raise ServerError( - f"Invalid response type {response!r} (need HTTPResponse)" - ) + raise ServerError(f"Invalid response type {response!r} (need HTTPResponse)") async def handle_request(self, request: Request) -> None: # no cov """Handles a request by dispatching it to the appropriate handler. @@ -1334,17 +1305,14 @@ class Sanic( else: if not hasattr(handler, "is_websocket"): raise ServerError( - f"Invalid response type {response!r} " - "(need HTTPResponse)" + f"Invalid response type {response!r} " "(need HTTPResponse)" ) except CancelledError: # type: ignore raise except Exception as e: # Response Generation Failed - await self.handle_exception( - request, e, run_middleware=run_middleware - ) + await self.handle_exception(request, e, run_middleware=run_middleware) async def _websocket_handler( self, handler, request, *args, subprotocols=None, **kwargs @@ -1423,9 +1391,7 @@ class Sanic( # Execution # -------------------------------------------------------------------- # - async def _run_request_middleware( - self, request, middleware_collection - ): # no cov + async def _run_request_middleware(self, request, middleware_collection): # no cov request._request_middleware_started = True for middleware in middleware_collection: @@ -1502,9 +1468,7 @@ class Sanic( task.cancel() @staticmethod - async def _listener( - app: Sanic, loop: AbstractEventLoop, listener: ListenerType - ): + async def _listener(app: Sanic, loop: AbstractEventLoop, listener: ListenerType): try: maybe_coro = listener(app) # type: ignore except TypeError: @@ -1533,9 +1497,7 @@ class Sanic( if isawaitable(task): await task except CancelledError: - error_logger.warning( - f"Task {task} was cancelled before it completed." - ) + error_logger.warning(f"Task {task} was cancelled before it completed.") raise except Exception as e: await app.dispatch( @@ -1644,18 +1606,14 @@ class Sanic( """ # noqa: E501 try: loop = self.loop # Will raise SanicError if loop is not started - return self._loop_add_task( - task, self, loop, name=name, register=register - ) + return self._loop_add_task(task, self, loop, name=name, register=register) except SanicException: task_name = f"sanic.delayed_task.{hash(task)}" if not self._delayed_tasks: self.after_server_start(partial(self.dispatch_delayed_tasks)) if name: - raise RuntimeError( - "Cannot name task outside of a running application" - ) + raise RuntimeError("Cannot name task outside of a running application") self.signal(task_name)(partial(self.run_delayed_task, task=task)) self._delayed_tasks.append(task_name) @@ -1666,18 +1624,14 @@ class Sanic( ... @overload - def get_task( - self, name: str, *, raise_exception: Literal[False] - ) -> Task | None: + def get_task(self, name: str, *, raise_exception: Literal[False]) -> Task | None: ... @overload def get_task(self, name: str, *, raise_exception: bool) -> Task | None: ... - def get_task( - self, name: str, *, raise_exception: bool = True - ) -> Task | None: + def get_task(self, name: str, *, raise_exception: bool = True) -> Task | None: """Get a named task. This method is used to get a task by its name. Optionally, you can @@ -1695,9 +1649,7 @@ class Sanic( return self._task_registry[name] except KeyError: if raise_exception: - raise SanicException( - f'Registered task named "{name}" not found.' - ) + raise SanicException(f'Registered task named "{name}" not found.') return None async def cancel_task( @@ -1809,11 +1761,7 @@ class Sanic( Iterable[Task[Any]]: The tasks that are currently registered with the application. """ - return ( - task - for task in iter(self._task_registry.values()) - if task is not None - ) + return (task for task in iter(self._task_registry.values()) if task is not None) # -------------------------------------------------------------------- # # ASGI @@ -2055,9 +2003,7 @@ class Sanic( del cls._app_registry[name] @classmethod - def get_app( - cls, name: str | None = None, *, force_create: bool = False - ) -> Sanic: + def get_app(cls, name: str | None = None, *, force_create: bool = False) -> Sanic: """Retrieve an instantiated Sanic instance by name. This method is best used when needing to get access to an already @@ -2264,9 +2210,7 @@ class Sanic( self.finalize() route_names = [route.extra.ident for route in self.router.routes] - duplicates = { - name for name in route_names if route_names.count(name) > 1 - } + duplicates = {name for name in route_names if route_names.count(name) > 1} if duplicates: names = ", ".join(duplicates) message = ( @@ -2311,9 +2255,7 @@ class Sanic( "shutdown", ): raise SanicException(f"Invalid server event: {event}") - logger.debug( - f"Triggering server events: {event}", extra={"verbosity": 1} - ) + logger.debug(f"Triggering server events: {event}", extra={"verbosity": 1}) reverse = concern == "shutdown" if loop is None: loop = self.loop @@ -2379,9 +2321,7 @@ class Sanic( Inspector: An instance of Inspector. """ if environ.get("SANIC_WORKER_PROCESS") or not self._inspector: - raise SanicException( - "Can only access the inspector from the main process" - ) + raise SanicException("Can only access the inspector from the main process") return self._inspector @property @@ -2414,7 +2354,5 @@ class Sanic( """ if environ.get("SANIC_WORKER_PROCESS") or not self._manager: - raise SanicException( - "Can only access the manager from the main process" - ) + raise SanicException("Can only access the manager from the main process") return self._manager diff --git a/sanic/application/logo.py b/sanic/application/logo.py index c8be7c85..4941f90f 100644 --- a/sanic/application/logo.py +++ b/sanic/application/logo.py @@ -61,10 +61,7 @@ def get_logo(full: bool = False, coffee: bool = False) -> str: else BASE_LOGO ) - if ( - sys.platform == "darwin" - and environ.get("TERM_PROGRAM") == "Apple_Terminal" - ): + if sys.platform == "darwin" and environ.get("TERM_PROGRAM") == "Apple_Terminal": logo = ansi_pattern.sub("", logo) return logo diff --git a/sanic/application/motd.py b/sanic/application/motd.py index 0409bd06..c618cc45 100644 --- a/sanic/application/motd.py +++ b/sanic/application/motd.py @@ -79,9 +79,7 @@ class MOTDTTY(MOTD): def set_variables(self): # no cov """Set the variables used for display.""" fallback = (108, 24) - terminal_width = max( - get_terminal_size(fallback=fallback).columns, fallback[0] - ) + terminal_width = max(get_terminal_size(fallback=fallback).columns, fallback[0]) self.max_value_width = terminal_width - fallback[0] + 36 self.key_width = 4 diff --git a/sanic/application/spinner.py b/sanic/application/spinner.py index f5431072..e2b42af5 100644 --- a/sanic/application/spinner.py +++ b/sanic/application/spinner.py @@ -52,13 +52,9 @@ class Spinner: # noqa if os.name == "nt": ci = _CursorInfo() handle = ctypes.windll.kernel32.GetStdHandle(-11) - ctypes.windll.kernel32.GetConsoleCursorInfo( - handle, ctypes.byref(ci) - ) + ctypes.windll.kernel32.GetConsoleCursorInfo(handle, ctypes.byref(ci)) ci.visible = False - ctypes.windll.kernel32.SetConsoleCursorInfo( - handle, ctypes.byref(ci) - ) + ctypes.windll.kernel32.SetConsoleCursorInfo(handle, ctypes.byref(ci)) elif os.name == "posix": sys.stdout.write("\033[?25l") sys.stdout.flush() @@ -68,13 +64,9 @@ class Spinner: # noqa if os.name == "nt": ci = _CursorInfo() handle = ctypes.windll.kernel32.GetStdHandle(-11) - ctypes.windll.kernel32.GetConsoleCursorInfo( - handle, ctypes.byref(ci) - ) + ctypes.windll.kernel32.GetConsoleCursorInfo(handle, ctypes.byref(ci)) ci.visible = True - ctypes.windll.kernel32.SetConsoleCursorInfo( - handle, ctypes.byref(ci) - ) + ctypes.windll.kernel32.SetConsoleCursorInfo(handle, ctypes.byref(ci)) elif os.name == "posix": sys.stdout.write("\033[?25h") sys.stdout.flush() diff --git a/sanic/application/state.py b/sanic/application/state.py index 435ba226..186ed92e 100644 --- a/sanic/application/state.py +++ b/sanic/application/state.py @@ -62,9 +62,7 @@ class ApplicationState: def __setattr__(self, name: str, value: Any) -> None: if self._init and name == "_init": - raise RuntimeError( - "Cannot change the value of _init after instantiation" - ) + raise RuntimeError("Cannot change the value of _init after instantiation") super().__setattr__(name, value) if self._init and hasattr(self, f"set_{name}"): getattr(self, f"set_{name}")(value) @@ -105,9 +103,7 @@ class ApplicationState: if all(info.stage is ServerStage.SERVING for info in self.server_info): return ServerStage.SERVING - elif any( - info.stage is ServerStage.SERVING for info in self.server_info - ): + elif any(info.stage is ServerStage.SERVING for info in self.server_info): return ServerStage.PARTIAL return ServerStage.STOPPED diff --git a/sanic/asgi.py b/sanic/asgi.py index fc01f0f7..7419eb45 100644 --- a/sanic/asgi.py +++ b/sanic/asgi.py @@ -140,9 +140,7 @@ class ASGIApp: ] ) except UnicodeDecodeError: - raise BadRequest( - "Header names can only contain US-ASCII characters" - ) + raise BadRequest("Header names can only contain US-ASCII characters") if scope["type"] == "http": version = scope["http_version"] @@ -151,9 +149,7 @@ class ASGIApp: version = "1.1" method = "GET" - instance.ws = instance.transport.create_websocket_connection( - send, receive - ) + instance.ws = instance.transport.create_websocket_connection(send, receive) else: raise ServerError("Received unknown ASGI scope") diff --git a/sanic/base/root.py b/sanic/base/root.py index fc0646fb..4f5229c4 100644 --- a/sanic/base/root.py +++ b/sanic/base/root.py @@ -24,9 +24,7 @@ class BaseSanic( ): __slots__ = ("name",) - def __init__( - self, name: Optional[str] = None, *args: Any, **kwargs: Any - ) -> None: + def __init__(self, name: Optional[str] = None, *args: Any, **kwargs: Any) -> None: class_name = self.__class__.__name__ if name is None: diff --git a/sanic/blueprints.py b/sanic/blueprints.py index 2b27ccd1..53c408c7 100644 --- a/sanic/blueprints.py +++ b/sanic/blueprints.py @@ -128,9 +128,7 @@ class Blueprint(BaseSanic): self.host = host self.strict_slashes = strict_slashes self.url_prefix = ( - url_prefix[:-1] - if url_prefix and url_prefix.endswith("/") - else url_prefix + url_prefix[:-1] if url_prefix and url_prefix.endswith("/") else url_prefix ) self.version = version self.version_prefix = version_prefix @@ -164,9 +162,7 @@ class Blueprint(BaseSanic): an app. """ if not self._apps: - raise SanicException( - f"{self} has not yet been registered to an app" - ) + raise SanicException(f"{self} has not yet been registered to an app") return self._apps @property @@ -345,9 +341,7 @@ class Blueprint(BaseSanic): opt_strict_slashes = options.get("strict_slashes", None) opt_version_prefix = options.get("version_prefix", self.version_prefix) opt_name_prefix = options.get("name_prefix", None) - error_format = options.get( - "error_format", app.config.FALLBACK_ERROR_FORMAT - ) + error_format = options.get("error_format", app.config.FALLBACK_ERROR_FORMAT) routes = [] middleware = [] @@ -373,9 +367,7 @@ class Blueprint(BaseSanic): version_prefix = prefix break - version = self._extract_value( - future.version, opt_version, self.version - ) + version = self._extract_value(future.version, opt_version, self.version) strict_slashes = self._extract_value( future.strict_slashes, opt_strict_slashes, self.strict_slashes ) @@ -411,22 +403,16 @@ class Blueprint(BaseSanic): continue registered.add(apply_route) - route = app._apply_route( - apply_route, overwrite=self._allow_route_overwrite - ) + route = app._apply_route(apply_route, overwrite=self._allow_route_overwrite) # If it is a copied BP, then make sure all of the names of routes # matchup with the new BP name if self.copied_from: for r in route: r.name = r.name.replace(self.copied_from, self.name) - r.extra.ident = r.extra.ident.replace( - self.copied_from, self.name - ) + r.extra.ident = r.extra.ident.replace(self.copied_from, self.name) - operation = ( - routes.extend if isinstance(route, list) else routes.append - ) + operation = routes.extend if isinstance(route, list) else routes.append operation(route) # Static Files @@ -504,9 +490,7 @@ class Blueprint(BaseSanic): condition = kwargs.pop("condition", {}) condition.update({"__blueprint__": self.name}) kwargs["condition"] = condition - await asyncio.gather( - *[app.dispatch(*args, **kwargs) for app in self.apps] - ) + await asyncio.gather(*[app.dispatch(*args, **kwargs) for app in self.apps]) def event(self, event: str, timeout: int | float | None = None): """Wait for a signal event to be dispatched. @@ -747,9 +731,7 @@ class BlueprintGroup(bpg_base): def __getitem__(self, item: slice) -> MutableSequence[Blueprint]: ... - def __getitem__( - self, item: int | slice - ) -> Blueprint | MutableSequence[Blueprint]: + def __getitem__(self, item: int | slice) -> Blueprint | MutableSequence[Blueprint]: """Get the Blueprint object at the specified index. This method returns a blueprint inside the group specified by diff --git a/sanic/cli/app.py b/sanic/cli/app.py index 9c41cd78..306f76c3 100644 --- a/sanic/cli/app.py +++ b/sanic/cli/app.py @@ -56,9 +56,7 @@ Or, a path to a directory to run as a simple HTTP server: ) self.parser._positionals.title = "Required\n========\n Positional" self.parser._optionals.title = "Optional\n========\n General" - self.main_process = ( - os.environ.get("SANIC_RELOADER_PROCESS", "") != "true" - ) + self.main_process = os.environ.get("SANIC_RELOADER_PROCESS", "") != "true" self.args: Namespace = Namespace() self.groups: List[Group] = [] self.inspecting = False @@ -126,11 +124,7 @@ Or, a path to a directory to run as a simple HTTP server: key = key.lstrip("-") except ValueError: value = False if arg.startswith("--no-") else True - key = ( - arg.replace("--no-", "") - .lstrip("-") - .replace("-", "_") - ) + key = arg.replace("--no-", "").lstrip("-").replace("-", "_") setattr(self.args, key, value) kwargs = {**self.args.__dict__} @@ -180,8 +174,7 @@ Or, a path to a directory to run as a simple HTTP server: " Example Module: project.sanic_server.app" ) error_logger.error( - "\nThe error below might have caused the above one:\n" - f"{e.msg}" + "\nThe error below might have caused the above one:\n" f"{e.msg}" ) sys.exit(1) else: diff --git a/sanic/cli/arguments.py b/sanic/cli/arguments.py index 114c9b76..61fbf23f 100644 --- a/sanic/cli/arguments.py +++ b/sanic/cli/arguments.py @@ -244,10 +244,7 @@ class DevelopmentGroup(Group): "--auto-reload", dest="auto_reload", action="store_true", - help=( - "Watch source directory for file changes and reload on " - "changes" - ), + help=("Watch source directory for file changes and reload on " "changes"), ) self.container.add_argument( "-R", diff --git a/sanic/cli/inspector_client.py b/sanic/cli/inspector_client.py index 7b57cf7e..5249627e 100644 --- a/sanic/cli/inspector_client.py +++ b/sanic/cli/inspector_client.py @@ -45,11 +45,7 @@ class InspectorClient: return result = self.request(action, **kwargs).get("result") if result: - out = ( - dumps(result) - if isinstance(result, (list, dict)) - else str(result) - ) + out = dumps(result) if isinstance(result, (list, dict)) else str(result) sys.stdout.write(out + "\n") def info(self) -> None: diff --git a/sanic/compat.py b/sanic/compat.py index 171b4b30..e0271747 100644 --- a/sanic/compat.py +++ b/sanic/compat.py @@ -12,9 +12,7 @@ from multidict import CIMultiDict # type: ignore from sanic.helpers import Default from sanic.log import error_logger -StartMethod = Union[ - Default, Literal["fork"], Literal["forkserver"], Literal["spawn"] -] +StartMethod = Union[Default, Literal["fork"], Literal["forkserver"], Literal["spawn"]] OS_IS_WINDOWS = os.name == "nt" PYPY_IMPLEMENTATION = platform.python_implementation() == "PyPy" diff --git a/sanic/config.py b/sanic/config.py index 7a8c0db5..f7facff4 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -227,9 +227,7 @@ class Config(dict, metaclass=DescriptorMeta): if attr == "LOCAL_CERT_CREATOR" and not isinstance( self.LOCAL_CERT_CREATOR, LocalCertCreator ): - self.LOCAL_CERT_CREATOR = LocalCertCreator[ - self.LOCAL_CERT_CREATOR.upper() - ] + self.LOCAL_CERT_CREATOR = LocalCertCreator[self.LOCAL_CERT_CREATOR.upper()] elif attr == "DEPRECATION_FILTER": self._configure_warnings() diff --git a/sanic/cookies/request.py b/sanic/cookies/request.py index 3cbf430c..90dbd0bb 100644 --- a/sanic/cookies/request.py +++ b/sanic/cookies/request.py @@ -147,9 +147,7 @@ class CookieRequestParameters(RequestParameters): except KeyError: return super().get(name, default) - def getlist( - self, name: str, default: Optional[Any] = None - ) -> Optional[Any]: + def getlist(self, name: str, default: Optional[Any] = None) -> Optional[Any]: try: return self._get_prefixed_cookie(name) except KeyError: diff --git a/sanic/cookies/response.py b/sanic/cookies/response.py index 401986ff..95f65dfb 100644 --- a/sanic/cookies/response.py +++ b/sanic/cookies/response.py @@ -496,9 +496,7 @@ class Cookie(dict): "Cannot set host_prefix on a cookie without secure=True" ) if path != "/": - raise ServerError( - "Cannot set host_prefix on a cookie unless path='/'" - ) + raise ServerError("Cannot set host_prefix on a cookie unless path='/'") if domain: raise ServerError( "Cannot set host_prefix on a cookie with a defined domain" @@ -600,9 +598,7 @@ class Cookie(dict): """Format as a Set-Cookie header value.""" output = [f"{self.key}={_quote(self.value)}"] key_index = list(self._keys) - for key, value in sorted( - self.items(), key=lambda x: key_index.index(x[0]) - ): + for key, value in sorted(self.items(), key=lambda x: key_index.index(x[0])): if value is not None and value is not False: if key == "max-age": try: diff --git a/sanic/errorpages.py b/sanic/errorpages.py index 2a89a8fb..93d45f03 100644 --- a/sanic/errorpages.py +++ b/sanic/errorpages.py @@ -190,8 +190,7 @@ class TextRenderer(BaseRenderer): lines += [ f"{self.exception.__class__.__name__}: {self.exception} while " f"handling path {self.request.path}", - f"Traceback of {self.request.app.name} " - "(most recent call last):\n", + f"Traceback of {self.request.app.name} " "(most recent call last):\n", ] while exc_value: @@ -388,9 +387,7 @@ def guess_mime(req: Request, fallback: str) -> str: if m: format = CONFIG_BY_MIME[m.mime] source = formats[format] - logger.debug( - f"The client accepts {m.header}, using '{format}' from {source}" - ) + logger.debug(f"The client accepts {m.header}, using '{format}' from {source}") else: logger.debug(f"No format found, the client accepts {req.accept!r}") return m.mime diff --git a/sanic/exceptions.py b/sanic/exceptions.py index 2076d6ea..c6ec73a0 100644 --- a/sanic/exceptions.py +++ b/sanic/exceptions.py @@ -69,9 +69,7 @@ class SanicException(Exception): ) -> None: self.context = context self.extra = extra - status_code = status_code or getattr( - self.__class__, "status_code", None - ) + status_code = status_code or getattr(self.__class__, "status_code", None) quiet = quiet or getattr(self.__class__, "quiet", None) headers = headers or getattr(self.__class__, "headers", {}) if message is None: diff --git a/sanic/handlers/content_range.py b/sanic/handlers/content_range.py index 44b92713..f9dbbb6d 100644 --- a/sanic/handlers/content_range.py +++ b/sanic/handlers/content_range.py @@ -36,20 +36,14 @@ class ContentRangeHandler(Range): try: self.start = int(start_b) if start_b else None except ValueError: - raise RangeNotSatisfiable( - f"'{start_b}' is invalid for Content Range", self - ) + raise RangeNotSatisfiable(f"'{start_b}' is invalid for Content Range", self) try: self.end = int(end_b) if end_b else None except ValueError: - raise RangeNotSatisfiable( - f"'{end_b}' is invalid for Content Range", self - ) + raise RangeNotSatisfiable(f"'{end_b}' is invalid for Content Range", self) if self.end is None: if self.start is None: - raise RangeNotSatisfiable( - "Invalid for Content Range parameters", self - ) + raise RangeNotSatisfiable("Invalid for Content Range parameters", self) else: # this case represents `Content-Range: bytes 5-` self.end = self.total - 1 @@ -59,13 +53,9 @@ class ContentRangeHandler(Range): self.start = self.total - self.end self.end = self.total - 1 if self.start >= self.end: - raise RangeNotSatisfiable( - "Invalid for Content Range parameters", self - ) + raise RangeNotSatisfiable("Invalid for Content Range parameters", self) self.size = self.end - self.start + 1 - self.headers = { - "Content-Range": f"bytes {self.start}-{self.end}/{self.total}" - } + self.headers = {"Content-Range": f"bytes {self.start}-{self.end}/{self.total}"} def __bool__(self): return hasattr(self, "size") and self.size > 0 diff --git a/sanic/handlers/directory.py b/sanic/handlers/directory.py index 26ee653a..8581328c 100644 --- a/sanic/handlers/directory.py +++ b/sanic/handlers/directory.py @@ -60,9 +60,7 @@ class DirectoryHandler: return await file(index_file) if self.directory_view: - return self._index( - self.directory / current, path, request.app.debug - ) + return self._index(self.directory / current, path, request.app.debug) if self.index: raise NotFound("File not found") @@ -72,9 +70,7 @@ class DirectoryHandler: def _index(self, location: Path, path: str, debug: bool): # Remove empty path elements, append slash if "//" in path or not path.endswith("/"): - return redirect( - "/" + "".join([f"{p}/" for p in path.split("/") if p]) - ) + return redirect("/" + "".join([f"{p}/" for p in path.split("/") if p])) # Render file browser page = DirectoryPage(self._iter_files(location), path, debug) @@ -83,9 +79,7 @@ class DirectoryHandler: def _prepare_file(self, path: Path) -> dict[str, int | str]: stat = path.stat() modified = ( - datetime.fromtimestamp(stat.st_mtime) - .isoformat()[:19] - .replace("T", " ") + datetime.fromtimestamp(stat.st_mtime).isoformat()[:19].replace("T", " ") ) is_dir = S_ISDIR(stat.st_mode) icon = "📁" if is_dir else "📄" diff --git a/sanic/handlers/error.py b/sanic/handlers/error.py index 20240670..2aaa2900 100644 --- a/sanic/handlers/error.py +++ b/sanic/handlers/error.py @@ -96,9 +96,7 @@ class ErrorHandler: exception_key = (ancestor, name) if exception_key in self.cached_handlers: handler = self.cached_handlers[exception_key] - self.cached_handlers[ - (exception_class, route_name) - ] = handler + self.cached_handlers[(exception_class, route_name)] = handler return handler if ancestor is BaseException: @@ -196,6 +194,4 @@ class ErrorHandler: except AttributeError: # no cov url = "unknown" - error_logger.exception( - "Exception occurred while handling uri: %s", url - ) + error_logger.exception("Exception occurred while handling uri: %s", url) diff --git a/sanic/headers.py b/sanic/headers.py index a52a5907..73686214 100644 --- a/sanic/headers.py +++ b/sanic/headers.py @@ -19,9 +19,7 @@ _token, _quoted = r"([\w!#$%&'*+\-.^_`|~]+)", r'"([^"]*)"' _param = re.compile(rf";\s*{_token}=(?:{_token}|{_quoted})", re.ASCII) _ipv6 = "(?:[0-9A-Fa-f]{0,4}:){2,7}[0-9A-Fa-f]{0,4}" _ipv6_re = re.compile(_ipv6) -_host_re = re.compile( - r"((?:\[" + _ipv6 + r"\])|[a-zA-Z0-9.\-]{1,253})(?::(\d{1,5}))?" -) +_host_re = re.compile(r"((?:\[" + _ipv6 + r"\])|[a-zA-Z0-9.\-]{1,253})(?::(\d{1,5}))?") # RFC's quoted-pair escapes are mostly ignored by browsers. Chrome, Firefox and # curl all have different escaping, that we try to handle as well as possible, @@ -122,9 +120,7 @@ class MediaType: or mt.subtype == "*" ) # Type match - and ( - self.type == mt.type or self.type == "*" or mt.type == "*" - ) + and (self.type == mt.type or self.type == "*" or mt.type == "*") ) else None ) @@ -312,9 +308,7 @@ def parse_accept(accept: str | None) -> AcceptList: accept = "*/*" # No header means that all types are accepted try: a = [ - mt - for mt in [MediaType._parse(mtype) for mtype in accept.split(",")] - if mt + mt for mt in [MediaType._parse(mtype) for mtype in accept.split(",")] if mt ] if not a: raise ValueError @@ -411,11 +405,7 @@ def parse_xforwarded(headers, config) -> Options | None: # Combine, split and filter multiple headers' entries forwarded_for = headers.getall(config.FORWARDED_FOR_HEADER) proxies = [ - p - for p in ( - p.strip() for h in forwarded_for for p in h.split(",") - ) - if p + p for p in (p.strip() for h in forwarded_for for p in h.split(",")) if p ] addr = proxies[-proxies_count] except (KeyError, IndexError): diff --git a/sanic/http/http1.py b/sanic/http/http1.py index a994b0d6..0446e59e 100644 --- a/sanic/http/http1.py +++ b/sanic/http/http1.py @@ -361,26 +361,20 @@ class Http(Stream, metaclass=TouchUpMeta): self.response_func = None self.stage = Stage.IDLE - async def http1_response_chunked( - self, data: bytes, end_stream: bool - ) -> None: + async def http1_response_chunked(self, data: bytes, end_stream: bool) -> None: """Format a part of response body in chunked encoding.""" # Chunked encoding size = len(data) if end_stream: await self._send( - b"%x\r\n%b\r\n0\r\n\r\n" % (size, data) - if size - else b"0\r\n\r\n" + b"%x\r\n%b\r\n0\r\n\r\n" % (size, data) if size else b"0\r\n\r\n" ) self.response_func = None self.stage = Stage.IDLE elif size: await self._send(b"%x\r\n%b\r\n" % (size, data)) - async def http1_response_normal( - self, data: bytes, end_stream: bool - ) -> None: + async def http1_response_normal(self, data: bytes, end_stream: bool) -> None: """Format / keep track of non-chunked response.""" bytes_left = self.response_bytes_left - len(data) if bytes_left <= 0: @@ -418,9 +412,7 @@ class Http(Stream, metaclass=TouchUpMeta): exception, (ServiceUnavailable, RequestCancelled) ) try: - await app.handle_exception( - self.request, exception, request_middleware - ) + await app.handle_exception(self.request, exception, request_middleware) except Exception as e: await app.handle_exception(self.request, e, False) diff --git a/sanic/http/http3.py b/sanic/http/http3.py index b5e60c21..c7e68df7 100644 --- a/sanic/http/http3.py +++ b/sanic/http/http3.py @@ -65,10 +65,7 @@ class HTTP3Transport(TransportProtocol): return self._protocol def get_extra_info(self, info: str, default: Any = None) -> Any: - if ( - info in ("socket", "sockname", "peername") - and self._protocol._transport - ): + if info in ("socket", "sockname", "peername") and self._protocol._transport: return self._protocol._transport.get_extra_info(info, default) elif info == "network_paths": return self._protocol._quic._network_paths @@ -114,8 +111,7 @@ class HTTPReceiver(Receiver, Stream): if exception: logger.info( # no cov - f"{Colors.BLUE}[exception]: " - f"{Colors.RED}{exception}{Colors.END}", + f"{Colors.BLUE}[exception]: " f"{Colors.RED}{exception}{Colors.END}", exc_info=True, extra={"verbosity": 1}, ) @@ -140,17 +136,13 @@ class HTTPReceiver(Receiver, Stream): await app.handle_exception(self.request, exception) - def _prepare_headers( - self, response: BaseHTTPResponse - ) -> list[tuple[bytes, bytes]]: + def _prepare_headers(self, response: BaseHTTPResponse) -> list[tuple[bytes, bytes]]: size = len(response.body) if response.body else 0 headers = response.headers status = response.status if not has_message_body(status) and ( - size - or "content-length" in headers - or "transfer-encoding" in headers + size or "content-length" in headers or "transfer-encoding" in headers ): headers.pop("content-length", None) headers.pop("transfer-encoding", None) @@ -243,11 +235,7 @@ class HTTPReceiver(Receiver, Stream): ): size = len(data) if end_stream: - data = ( - b"%x\r\n%b\r\n0\r\n\r\n" % (size, data) - if size - else b"0\r\n\r\n" - ) + data = b"%x\r\n%b\r\n0\r\n\r\n" % (size, data) if size else b"0\r\n\r\n" elif size: data = b"%x\r\n%b\r\n" % (size, data) @@ -325,10 +313,7 @@ class Http3: ) def get_or_make_receiver(self, event: H3Event) -> tuple[Receiver, bool]: - if ( - isinstance(event, HeadersReceived) - and event.stream_id not in self.receivers - ): + if isinstance(event, HeadersReceived) and event.stream_id not in self.receivers: request = self._make_request(event) receiver = HTTPReceiver(self.transmit, self.protocol, request) request.stream = receiver @@ -351,9 +336,7 @@ class Http3: ) ) except UnicodeDecodeError: - raise BadRequest( - "Header names may only contain US-ASCII characters." - ) + raise BadRequest("Header names may only contain US-ASCII characters.") method = headers[":method"] path = headers[":path"] scheme = headers.pop(":scheme", "") @@ -422,8 +405,6 @@ def get_config(app: Sanic, ssl: SanicSSLContext | CertSelector | SSLContext): ) password = app.config.TLS_CERT_PASSWORD or None - config.load_cert_chain( - ssl.sanic["cert"], ssl.sanic["key"], password=password - ) + config.load_cert_chain(ssl.sanic["cert"], ssl.sanic["key"], password=password) return config diff --git a/sanic/http/stream.py b/sanic/http/stream.py index 6fdbaa2e..64eb0fcd 100644 --- a/sanic/http/stream.py +++ b/sanic/http/stream.py @@ -20,7 +20,5 @@ class Stream: __touchup__: tuple[str, ...] = () __slots__ = ("request_max_size",) - def respond( - self, response: BaseHTTPResponse - ) -> BaseHTTPResponse: # no cov + def respond(self, response: BaseHTTPResponse) -> BaseHTTPResponse: # no cov raise NotImplementedError("Not implemented") diff --git a/sanic/http/tls/context.py b/sanic/http/tls/context.py index 1dd12f59..dffb2201 100644 --- a/sanic/http/tls/context.py +++ b/sanic/http/tls/context.py @@ -69,13 +69,9 @@ def load_cert_dir(p: str) -> ssl.SSLContext: keyfile = os.path.join(p, "privkey.pem") certfile = os.path.join(p, "fullchain.pem") if not os.access(keyfile, os.R_OK): - raise ValueError( - f"Certificate not found or permission denied {keyfile}" - ) + raise ValueError(f"Certificate not found or permission denied {keyfile}") if not os.access(certfile, os.R_OK): - raise ValueError( - f"Certificate not found or permission denied {certfile}" - ) + raise ValueError(f"Certificate not found or permission denied {certfile}") return CertSimple(certfile, keyfile) @@ -87,9 +83,7 @@ def find_cert(self: CertSelector, server_name: str): if not server_name: if self.sanic_fallback: return self.sanic_fallback - raise ValueError( - "The client provided no SNI to match for certificate." - ) + raise ValueError("The client provided no SNI to match for certificate.") for ctx in self.sanic_select: if match_hostname(ctx, server_name): return ctx @@ -162,9 +156,7 @@ class CertSimple(SanicSSLContext): if "names" not in kw: cert = ssl._ssl._test_decode_cert(certfile) # type: ignore kw["names"] = [ - name - for t, name in cert["subjectAltName"] - if t in ["DNS", "IP Address"] + name for t, name in cert["subjectAltName"] if t in ["DNS", "IP Address"] ] subject = {k: v for item in cert["subject"] for k, v in item} self = create_context(certfile, keyfile, password) @@ -201,7 +193,5 @@ class CertSelector(ssl.SSLContext): if i == 0: self.sanic_fallback = ctx if not all_names: - raise ValueError( - "No certificates with SubjectAlternativeNames found." - ) + raise ValueError("No certificates with SubjectAlternativeNames found.") logger.info(f"Certificate vhosts: {', '.join(all_names)}") diff --git a/sanic/http/tls/creators.py b/sanic/http/tls/creators.py index 9da4aab1..a33d0cb8 100644 --- a/sanic/http/tls/creators.py +++ b/sanic/http/tls/creators.py @@ -92,16 +92,8 @@ class CertCreator(ABC): if isinstance(self.key, Default) or isinstance(self.cert, Default): self.tmpdir = Path(mkdtemp()) - key = ( - DEFAULT_LOCAL_TLS_KEY - if isinstance(self.key, Default) - else self.key - ) - cert = ( - DEFAULT_LOCAL_TLS_CERT - if isinstance(self.cert, Default) - else self.cert - ) + key = DEFAULT_LOCAL_TLS_KEY if isinstance(self.key, Default) else self.key + cert = DEFAULT_LOCAL_TLS_CERT if isinstance(self.cert, Default) else self.cert self.key_path = _make_path(key, self.tmpdir) self.cert_path = _make_path(cert, self.tmpdir) @@ -124,9 +116,7 @@ class CertCreator(ABC): ) -> CertCreator: creator: CertCreator | None = None - cert_creator_options: tuple[ - tuple[type[CertCreator], LocalCertCreator], ... - ] = ( + cert_creator_options: tuple[tuple[type[CertCreator], LocalCertCreator], ...] = ( (MkcertCreator, LocalCertCreator.MKCERT), (TrustmeCreator, LocalCertCreator.TRUSTME), ) diff --git a/sanic/mixins/exceptions.py b/sanic/mixins/exceptions.py index 0f290a98..d6e2b70a 100644 --- a/sanic/mixins/exceptions.py +++ b/sanic/mixins/exceptions.py @@ -79,9 +79,7 @@ class ExceptionMixin(metaclass=SanicMeta): return decorator - def all_exceptions( - self, handler: Callable[..., Any] - ) -> Callable[..., Any]: + def all_exceptions(self, handler: Callable[..., Any]) -> Callable[..., Any]: """Enables the process of creating a global exception handler as a convenience. This following two examples are equivalent: diff --git a/sanic/mixins/listeners.py b/sanic/mixins/listeners.py index 6b547ca9..0894f9cb 100644 --- a/sanic/mixins/listeners.py +++ b/sanic/mixins/listeners.py @@ -120,16 +120,12 @@ class ListenerMixin(metaclass=SanicMeta): if callable(listener_or_event): if event_or_none is None: - raise BadRequest( - "Invalid event registration: Missing event name." - ) + raise BadRequest("Invalid event registration: Missing event name.") return register_listener(listener_or_event, event_or_none) else: return partial(register_listener, event=listener_or_event) - def main_process_start( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def main_process_start(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the main_process_start event. This event is fired only on the main process and **NOT** on any @@ -151,9 +147,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "main_process_start") - def main_process_ready( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def main_process_ready(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the main_process_ready event. This event is fired only on the main process and **NOT** on any @@ -176,9 +170,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "main_process_ready") - def main_process_stop( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def main_process_stop(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the main_process_stop event. This event is fired only on the main process and **NOT** on any @@ -222,9 +214,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "reload_process_start") - def reload_process_stop( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def reload_process_stop(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the reload_process_stop event. This event is fired only on the reload process and **NOT** on any @@ -293,9 +283,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "after_reload_trigger") - def before_server_start( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def before_server_start(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the before_server_start event. This event is fired on all worker processes. You should typically @@ -319,9 +307,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "before_server_start") - def after_server_start( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def after_server_start(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the after_server_start event. This event is fired on all worker processes. You should typically @@ -349,9 +335,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "after_server_start") - def before_server_stop( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def before_server_stop(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the before_server_stop event. This event is fired on all worker processes. This event is fired @@ -376,9 +360,7 @@ class ListenerMixin(metaclass=SanicMeta): """ # noqa: E501 return self.listener(listener, "before_server_stop") - def after_server_stop( - self, listener: ListenerType[Sanic] - ) -> ListenerType[Sanic]: + def after_server_stop(self, listener: ListenerType[Sanic]) -> ListenerType[Sanic]: """Decorator for registering a listener for the after_server_stop event. This event is fired on all worker processes. This event is fired diff --git a/sanic/mixins/middleware.py b/sanic/mixins/middleware.py index 89179af8..8953548a 100644 --- a/sanic/mixins/middleware.py +++ b/sanic/mixins/middleware.py @@ -99,13 +99,9 @@ class MiddlewareMixin(metaclass=SanicMeta): # Detect which way this was called, @middleware or @middleware('AT') if callable(middleware_or_request): - return register_middleware( - middleware_or_request, attach_to=attach_to - ) + return register_middleware(middleware_or_request, attach_to=attach_to) else: - return partial( - register_middleware, attach_to=middleware_or_request - ) + return partial(register_middleware, attach_to=middleware_or_request) def on_request(self, middleware=None, *, priority=0) -> MiddlewareType: """Register a middleware to be called before a request is handled. @@ -157,9 +153,7 @@ class MiddlewareMixin(metaclass=SanicMeta): if callable(middleware): return self.middleware(middleware, "response", priority=priority) else: - return partial( - self.middleware, attach_to="response", priority=priority - ) + return partial(self.middleware, attach_to="response", priority=priority) def finalize_middleware(self) -> None: """Finalize the middleware configuration for the Sanic application. diff --git a/sanic/mixins/routes.py b/sanic/mixins/routes.py index dfda51e2..f5e25f0d 100644 --- a/sanic/mixins/routes.py +++ b/sanic/mixins/routes.py @@ -25,9 +25,7 @@ from sanic.models.futures import FutureRoute, FutureStatic from sanic.models.handler_types import RouteHandler from sanic.types import HashableDict -RouteWrapper = Callable[ - [RouteHandler], Union[RouteHandler, Tuple[Route, RouteHandler]] -] +RouteWrapper = Callable[[RouteHandler], Union[RouteHandler, Tuple[Route, RouteHandler]]] class RouteMixin(BaseMixin, metaclass=SanicMeta): @@ -814,7 +812,5 @@ class RouteMixin(BaseMixin, metaclass=SanicMeta): } if raw: unexpected_arguments = ", ".join(raw.keys()) - raise TypeError( - f"Unexpected keyword arguments: {unexpected_arguments}" - ) + raise TypeError(f"Unexpected keyword arguments: {unexpected_arguments}") return HashableDict(ctx_kwargs) diff --git a/sanic/mixins/signals.py b/sanic/mixins/signals.py index 16ffd2fe..6f1247cf 100644 --- a/sanic/mixins/signals.py +++ b/sanic/mixins/signals.py @@ -92,9 +92,7 @@ class SignalMixin(metaclass=SanicMeta): ... handler = noop - self.signal(event=event, condition=condition, exclusive=exclusive)( - handler - ) + self.signal(event=event, condition=condition, exclusive=exclusive)(handler) return handler def event(self, event: str): diff --git a/sanic/mixins/startup.py b/sanic/mixins/startup.py index 16ce3637..7fe8b51b 100644 --- a/sanic/mixins/startup.py +++ b/sanic/mixins/startup.py @@ -100,8 +100,7 @@ class StartupMixin(metaclass=SanicMeta): """ if not self.asgi: if self.config.USE_UVLOOP is True or ( - isinstance(self.config.USE_UVLOOP, Default) - and not OS_IS_WINDOWS + isinstance(self.config.USE_UVLOOP, Default) and not OS_IS_WINDOWS ): try_use_uvloop() elif OS_IS_WINDOWS: @@ -373,8 +372,7 @@ class StartupMixin(metaclass=SanicMeta): if single_process and (fast or (workers > 1) or auto_reload): raise RuntimeError( - "Single process cannot be run with multiple workers " - "or auto-reload" + "Single process cannot be run with multiple workers " "or auto-reload" ) if register_sys_signals is False and not single_process: @@ -393,9 +391,7 @@ class StartupMixin(metaclass=SanicMeta): for directory in reload_dir: direc = Path(directory) if not direc.is_dir(): - logger.warning( - f"Directory {directory} could not be located" - ) + logger.warning(f"Directory {directory} could not be located") self.state.reload_dirs.add(Path(directory)) if loop is not None: @@ -410,9 +406,7 @@ class StartupMixin(metaclass=SanicMeta): host, port = self.get_address(host, port, version, auto_tls) if protocol is None: - protocol = ( - WebSocketProtocol if self.websocket_enabled else HttpProtocol - ) + protocol = WebSocketProtocol if self.websocket_enabled else HttpProtocol # Set explicitly passed configuration values for attribute, value in { @@ -448,9 +442,7 @@ class StartupMixin(metaclass=SanicMeta): register_sys_signals=register_sys_signals, auto_tls=auto_tls, ) - self.state.server_info.append( - ApplicationServerInfo(settings=server_settings) - ) + self.state.server_info.append(ApplicationServerInfo(settings=server_settings)) # if self.config.USE_UVLOOP is True or ( # self.config.USE_UVLOOP is _default and not OS_IS_WINDOWS @@ -546,9 +538,7 @@ class StartupMixin(metaclass=SanicMeta): host, port = host, port = self.get_address(host, port) if protocol is None: - protocol = ( - WebSocketProtocol if self.websocket_enabled else HttpProtocol - ) + protocol = WebSocketProtocol if self.websocket_enabled else HttpProtocol # Set explicitly passed configuration values for attribute, value in { @@ -790,10 +780,7 @@ class StartupMixin(metaclass=SanicMeta): reload_display += ", ".join( [ "", - *( - str(path.absolute()) - for path in self.state.reload_dirs - ), + *(str(path.absolute()) for path in self.state.reload_dirs), ] ) display["auto-reload"] = reload_display @@ -832,9 +819,7 @@ class StartupMixin(metaclass=SanicMeta): return f"http://<{location}>" @staticmethod - def get_server_location( - server_settings: dict[str, Any] | None = None - ) -> str: + def get_server_location(server_settings: dict[str, Any] | None = None) -> str: """Using the server settings, retrieve the server location. Args: @@ -901,9 +886,7 @@ class StartupMixin(metaclass=SanicMeta): @classmethod def _get_startup_method(cls) -> str: return ( - cls.start_method - if not isinstance(cls.start_method, Default) - else "spawn" + cls.start_method if not isinstance(cls.start_method, Default) else "spawn" ) @classmethod @@ -984,9 +967,7 @@ class StartupMixin(metaclass=SanicMeta): try: primary = apps[0] except IndexError: - raise RuntimeError( - "Did not find any applications." - ) from None + raise RuntimeError("Did not find any applications.") from None # This exists primarily for unit testing if not primary.state.server_info: # no cov @@ -1089,9 +1070,7 @@ class StartupMixin(metaclass=SanicMeta): inspector = None if primary.config.INSPECTOR: display, extra = primary.get_motd_data() - packages = [ - pkg.strip() for pkg in display["packages"].split(",") - ] + packages = [pkg.strip() for pkg in display["packages"].split(",")] module = import_module("sanic") sanic_version = f"sanic=={module.__version__}" # type: ignore app_info = { @@ -1122,9 +1101,7 @@ class StartupMixin(metaclass=SanicMeta): exit_code = 1 except BaseException: kwargs = primary_server_info.settings - error_logger.exception( - "Experienced exception while trying to serve" - ) + error_logger.exception("Experienced exception while trying to serve") raise finally: logger.info("Server Stopped") @@ -1230,9 +1207,7 @@ class StartupMixin(metaclass=SanicMeta): try: worker_serve(monitor_publisher=None, **kwargs) except BaseException: - error_logger.exception( - "Experienced exception while trying to serve" - ) + error_logger.exception("Experienced exception while trying to serve") raise finally: logger.info("Server Stopped") diff --git a/sanic/mixins/static.py b/sanic/mixins/static.py index 88f7ab26..291399bf 100644 --- a/sanic/mixins/static.py +++ b/sanic/mixins/static.py @@ -205,17 +205,12 @@ class StaticHandleMixin(metaclass=SanicMeta): ) uri = uri.rstrip("/") uri += "/<__file_uri__:path>" - elif static.resource_type == "file" and not path.isfile( - file_or_directory - ): + elif static.resource_type == "file" and not path.isfile(file_or_directory): raise TypeError( - "Resource type improperly identified as file. " - f"'{file_or_directory}'" + "Resource type improperly identified as file. " f"'{file_or_directory}'" ) elif static.resource_type != "file": - raise ValueError( - "The resource_type should be set to 'file' or 'dir'" - ) + raise ValueError("The resource_type should be set to 'file' or 'dir'") # special prefix for static files # if not static.name.startswith("_static_"): @@ -278,9 +273,7 @@ class StaticHandleMixin(metaclass=SanicMeta): response = await validate_file(request.headers, modified_since) if response: return response - headers["Last-Modified"] = formatdate( - modified_since, usegmt=True - ) + headers["Last-Modified"] = formatdate(modified_since, usegmt=True) _range = None if use_content_range: _range = None diff --git a/sanic/models/asgi.py b/sanic/models/asgi.py index de2cfd3f..48133b61 100644 --- a/sanic/models/asgi.py +++ b/sanic/models/asgi.py @@ -47,9 +47,7 @@ class MockProtocol: # no cov class MockTransport(TransportProtocol): # no cov _protocol: Optional[MockProtocol] - def __init__( - self, scope: ASGIScope, receive: ASGIReceive, send: ASGISend - ) -> None: + def __init__(self, scope: ASGIScope, receive: ASGIReceive, send: ASGISend) -> None: self.scope = scope self._receive = receive self._send = send @@ -61,9 +59,7 @@ class MockTransport(TransportProtocol): # no cov self._protocol = MockProtocol(self, self.loop) return self._protocol - def get_extra_info( - self, info: str, default=None - ) -> Optional[Union[str, bool]]: + def get_extra_info(self, info: str, default=None) -> Optional[Union[str, bool]]: if info == "peername": return self.scope.get("client") elif info == "sslcontext": diff --git a/sanic/models/handler_types.py b/sanic/models/handler_types.py index d2bb205e..b9b5bfc1 100644 --- a/sanic/models/handler_types.py +++ b/sanic/models/handler_types.py @@ -12,9 +12,7 @@ MiddlewareResponse = Union[ Optional[HTTPResponse], Coroutine[Any, Any, Optional[HTTPResponse]] ] RequestMiddlewareType = Callable[[Request], MiddlewareResponse] -ResponseMiddlewareType = Callable[ - [Request, BaseHTTPResponse], MiddlewareResponse -] +ResponseMiddlewareType = Callable[[Request, BaseHTTPResponse], MiddlewareResponse] ErrorMiddlewareType = Callable[ [Request, BaseException], Optional[Coroutine[Any, Any, None]] ] diff --git a/sanic/pages/css.py b/sanic/pages/css.py index 9dfa5338..b74e3733 100644 --- a/sanic/pages/css.py +++ b/sanic/pages/css.py @@ -27,8 +27,6 @@ class CSS(ABCMeta): Page.STYLE += attrs.get("STYLE_APPEND", "") # Combine with all ancestor styles Page.CSS = "".join( - Class.STYLE - for Class in reversed(Page.__mro__) - if type(Class) is CSS + Class.STYLE for Class in reversed(Page.__mro__) if type(Class) is CSS ) return Page diff --git a/sanic/pages/directory_page.py b/sanic/pages/directory_page.py index f8431926..376b5595 100644 --- a/sanic/pages/directory_page.py +++ b/sanic/pages/directory_page.py @@ -19,9 +19,7 @@ class DirectoryPage(BasePage): # no cov TITLE = "Directory Viewer" - def __init__( - self, files: Iterable[FileInfo], url: str, debug: bool - ) -> None: + def __init__(self, files: Iterable[FileInfo], url: str, debug: bool) -> None: super().__init__(debug) self.files = files self.url = url diff --git a/sanic/pages/error.py b/sanic/pages/error.py index 33f52a9d..75b6cc89 100644 --- a/sanic/pages/error.py +++ b/sanic/pages/error.py @@ -37,9 +37,7 @@ class ErrorPage(BasePage): if name.islower(): name = name.title() self.TITLE = f"Application {name} cannot handle your request" - self.HEADING = E("Application ").strong(name)( - " cannot handle your request" - ) + self.HEADING = E("Application ").strong(name)(" cannot handle your request") self.title = title self.text = text self.request = request @@ -58,9 +56,7 @@ class ErrorPage(BasePage): # Show context details if available on the exception context = getattr(self.exc, "context", None) if context: - self._key_value_table( - "Issue context", "exception-context", context - ) + self._key_value_table("Issue context", "exception-context", context) if not debug: with self.doc.div(id="enduser"): @@ -72,19 +68,13 @@ class ErrorPage(BasePage): # Show extra details if available on the exception extra = getattr(self.exc, "extra", None) if extra: - self._key_value_table( - "Issue extra data", "exception-extra", extra - ) + self._key_value_table("Issue extra data", "exception-extra", extra) - self.doc.summary( - "Details for developers (Sanic debug mode only)" - ) + self.doc.summary("Details for developers (Sanic debug mode only)") if self.exc: with self.doc.div(class_="exception-wrapper"): self.doc.h2(f"Exception in {route_name}:") - self.doc( - html_traceback(self.exc, include_js_css=False) - ) + self.doc(html_traceback(self.exc, include_js_css=False)) self._key_value_table( f"{self.request.method} {self.request.path}", @@ -104,6 +94,4 @@ class ErrorPage(BasePage): value = str(value) except Exception: value = E.em("Unable to display value") - self.doc.dt.span(key, class_="nobr key").span(": ").dd( - value - ) + self.doc.dt.span(key, class_="nobr key").span(": ").dd(value) diff --git a/sanic/request/form.py b/sanic/request/form.py index 18c97205..805f3ad9 100644 --- a/sanic/request/form.py +++ b/sanic/request/form.py @@ -60,9 +60,7 @@ def parse_multipart_form(body, boundary): colon_index = form_line.index(":") idx = colon_index + 2 form_header_field = form_line[0:colon_index].lower() - form_header_value, form_parameters = parse_content_header( - form_line[idx:] - ) + form_header_value, form_parameters = parse_content_header(form_line[idx:]) if form_header_field == "content-disposition": field_name = form_parameters.get("name") @@ -97,9 +95,7 @@ def parse_multipart_form(body, boundary): else: fields[field_name] = [value] else: - form_file = File( - type=content_type, name=file_name, body=post_data - ) + form_file = File(type=content_type, name=file_name, body=post_data) if field_name in files: files[field_name].append(form_file) else: diff --git a/sanic/request/types.py b/sanic/request/types.py index 67eb47b7..294a46dc 100644 --- a/sanic/request/types.py +++ b/sanic/request/types.py @@ -279,9 +279,7 @@ class Request(Generic[sanic_type, ctx_type]): int: The HTTP/3 stream ID. """ if self.protocol.version is not HTTP.VERSION_3: - raise ServerError( - "Stream ID is only a property of a HTTP/3 request" - ) + raise ServerError("Stream ID is only a property of a HTTP/3 request") return self._stream_id def reset_response(self) -> None: @@ -296,10 +294,7 @@ class Request(Generic[sanic_type, ctx_type]): sent. """ try: - if ( - self.stream is not None - and self.stream.stage is not Stage.HANDLER - ): + if self.stream is not None and self.stream.stage is not Stage.HANDLER: raise ServerError( "Cannot reset response because previous response was sent." ) @@ -622,9 +617,7 @@ class Request(Generic[sanic_type, ctx_type]): pass return self.parsed_credentials - def get_form( - self, keep_blank_values: bool = False - ) -> RequestParameters | None: + def get_form(self, keep_blank_values: bool = False) -> RequestParameters | None: """Method to extract and parse the form data from a request. Args: @@ -635,9 +628,7 @@ class Request(Generic[sanic_type, ctx_type]): """ # noqa: E501 self.parsed_form = RequestParameters() self.parsed_files = RequestParameters() - content_type = self.headers.getone( - "content-type", DEFAULT_HTTP_CONTENT_TYPE - ) + content_type = self.headers.getone("content-type", DEFAULT_HTTP_CONTENT_TYPE) content_type, parameters = parse_content_header(content_type) try: if content_type == "application/x-www-form-urlencoded": @@ -735,9 +726,7 @@ class Request(Generic[sanic_type, ctx_type]): ) ) - return self.parsed_args[ - (keep_blank_values, strict_parsing, encoding, errors) - ] + return self.parsed_args[(keep_blank_values, strict_parsing, encoding, errors)] args = property(get_args) """Convenience property to access `Request.get_args` with default values. @@ -990,9 +979,7 @@ class Request(Generic[sanic_type, ctx_type]): server_name = self.app.config.get("SERVER_NAME") if server_name: return server_name.split("//", 1)[-1].split("/", 1)[0] - return str( - self.forwarded.get("host") or self.headers.getone("host", "") - ) + return str(self.forwarded.get("host") or self.headers.getone("host", "")) @property def server_name(self) -> str: diff --git a/sanic/response/convenience.py b/sanic/response/convenience.py index ccad7435..cbb68305 100644 --- a/sanic/response/convenience.py +++ b/sanic/response/convenience.py @@ -18,9 +18,7 @@ from sanic.models.protocol_types import HTMLProtocol, Range from .types import HTTPResponse, JSONResponse, ResponseStream -def empty( - status: int = 204, headers: dict[str, str] | None = None -) -> HTTPResponse: +def empty(status: int = 204, headers: dict[str, str] | None = None) -> HTTPResponse: """Returns an empty response to the client. Args: @@ -85,13 +83,9 @@ def text( TypeError: If the body is not a string. """ # noqa: E501 if not isinstance(body, str): - raise TypeError( - f"Bad body type. Expected str, got {type(body).__name__})" - ) + raise TypeError(f"Bad body type. Expected str, got {type(body).__name__})") - return HTTPResponse( - body, status=status, headers=headers, content_type=content_type - ) + return HTTPResponse(body, status=status, headers=headers, content_type=content_type) def raw( @@ -178,18 +172,14 @@ async def validate_file( float(last_modified), tz=timezone.utc ).replace(microsecond=0) - if ( - last_modified.utcoffset() is None - and if_modified_since.utcoffset() is not None - ): + if last_modified.utcoffset() is None and if_modified_since.utcoffset() is not None: logger.warning( "Cannot compare tz-aware and tz-naive datetimes. To avoid " "this conflict Sanic is converting last_modified to UTC." ) last_modified.replace(tzinfo=timezone.utc) elif ( - last_modified.utcoffset() is not None - and if_modified_since.utcoffset() is None + last_modified.utcoffset() is not None and if_modified_since.utcoffset() is None ): logger.warning( "Cannot compare tz-aware and tz-naive datetimes. To avoid " @@ -240,25 +230,17 @@ async def file( stat = await stat_async(location) last_modified = stat.st_mtime - if ( - validate_when_requested - and request_headers is not None - and last_modified - ): + if validate_when_requested and request_headers is not None and last_modified: response = await validate_file(request_headers, last_modified) if response: return response headers = headers or {} if last_modified: - headers.setdefault( - "Last-Modified", formatdate(last_modified, usegmt=True) - ) + headers.setdefault("Last-Modified", formatdate(last_modified, usegmt=True)) if filename: - headers.setdefault( - "Content-Disposition", f'attachment; filename="{filename}"' - ) + headers.setdefault("Content-Disposition", f'attachment; filename="{filename}"') if no_store: cache_control = "no-store" @@ -323,9 +305,7 @@ def redirect( # According to RFC 7231, a relative URI is now permitted. headers["Location"] = safe_to - return HTTPResponse( - status=status, headers=headers, content_type=content_type - ) + return HTTPResponse(status=status, headers=headers, content_type=content_type) async def file_stream( @@ -357,9 +337,7 @@ async def file_stream( """ # noqa: E501 headers = headers or {} if filename: - headers.setdefault( - "Content-Disposition", f'attachment; filename="{filename}"' - ) + headers.setdefault("Content-Disposition", f'attachment; filename="{filename}"') filename = filename or path.split(location)[-1] mime_type = mime_type or guess_type(filename)[0] or "text/plain" if _range: diff --git a/sanic/response/types.py b/sanic/response/types.py index c96ba173..558fda6e 100644 --- a/sanic/response/types.py +++ b/sanic/response/types.py @@ -350,9 +350,7 @@ class JSONResponse(HTTPResponse): @raw_body.setter def raw_body(self, value: Any): self._body_manually_set = False - self._body = self._encode_body( - self._use_dumps(value, **self._use_dumps_kwargs) - ) + self._body = self._encode_body(self._use_dumps(value, **self._use_dumps_kwargs)) self._raw_body = value @property # type: ignore @@ -484,9 +482,7 @@ class JSONResponse(HTTPResponse): self._check_body_not_manually_set() if not isinstance(self._raw_body, (list, dict)): - raise SanicException( - "Cannot pop from a non-list and non-dict object." - ) + raise SanicException("Cannot pop from a non-list and non-dict object.") if isinstance(default, Default): value = self._raw_body.pop(key) diff --git a/sanic/router.py b/sanic/router.py index 0f016c64..5dc330bb 100644 --- a/sanic/router.py +++ b/sanic/router.py @@ -40,9 +40,7 @@ class Router(BaseRouter): raise MethodNotAllowed( f"Method {method} not allowed for URL {path}", method=method, - allowed_methods=tuple(e.allowed_methods) - if e.allowed_methods - else None, + allowed_methods=tuple(e.allowed_methods) if e.allowed_methods else None, ) from None @lru_cache(maxsize=ROUTER_CACHE_SIZE) @@ -137,11 +135,7 @@ class Router(BaseRouter): ident = name if len(hosts) > 1: - ident = ( - f"{name}_{host.replace('.', '_')}" - if name - else "__unnamed__" - ) + ident = f"{name}_{host.replace('.', '_')}" if name else "__unnamed__" route = super().add(**params) # type: ignore route.extra.ident = ident diff --git a/sanic/server/protocols/http_protocol.py b/sanic/server/protocols/http_protocol.py index f63d61dd..bef3a2fc 100644 --- a/sanic/server/protocols/http_protocol.py +++ b/sanic/server/protocols/http_protocol.py @@ -303,9 +303,7 @@ class Http3Protocol(HttpProtocolMixin, ConnectionProtocol): # type: ignore if isinstance(event, ProtocolNegotiated): self._setup_connection(transmit=self.transmit) if event.alpn_protocol in H3_ALPN: - self._connection = H3Connection( - self._quic, enable_webtransport=True - ) + self._connection = H3Connection(self._quic, enable_webtransport=True) elif isinstance(event, DatagramFrameReceived): if event.data == b"quack": self._quic.send_datagram_frame(b"quack-ack") diff --git a/sanic/server/protocols/websocket_protocol.py b/sanic/server/protocols/websocket_protocol.py index f137e0fa..7d23d3a0 100644 --- a/sanic/server/protocols/websocket_protocol.py +++ b/sanic/server/protocols/websocket_protocol.py @@ -140,8 +140,7 @@ class WebSocketProtocol(HttpProtocol): ) loop = ( request.transport.loop - if hasattr(request, "transport") - and hasattr(request.transport, "loop") + if hasattr(request, "transport") and hasattr(request.transport, "loop") else None ) await self.websocket.connection_made(self, loop=loop) diff --git a/sanic/server/runners.py b/sanic/server/runners.py index fc361d8f..3346b350 100644 --- a/sanic/server/runners.py +++ b/sanic/server/runners.py @@ -167,9 +167,7 @@ def _setup_system_signals( ctrlc_workaround_for_windows(app) else: for _signal in [SIGTERM] if run_multiple else [SIGINT, SIGTERM]: - loop.add_signal_handler( - _signal, partial(app.stop, terminate=False) - ) + loop.add_signal_handler(_signal, partial(app.stop, terminate=False)) def _run_server_forever(loop, before_stop, after_stop, cleanup, unix): @@ -223,9 +221,7 @@ def _serve_http_1( unix=unix, **protocol_kwargs, ) - asyncio_server_kwargs = ( - asyncio_server_kwargs if asyncio_server_kwargs else {} - ) + asyncio_server_kwargs = asyncio_server_kwargs if asyncio_server_kwargs else {} if OS_IS_WINDOWS and sock: pid = os.getpid() sock = sock.share(pid) @@ -314,9 +310,7 @@ def _serve_http_3( run_multiple: bool = False, ): if not HTTP3_AVAILABLE: - raise ServerError( - "Cannot run HTTP/3 server without aioquic installed. " - ) + raise ServerError("Cannot run HTTP/3 server without aioquic installed. ") protocol = partial(Http3Protocol, app=app) ticket_store = SessionTicketStore() ssl_context = get_ssl_context(app, ssl) @@ -339,9 +333,7 @@ def _serve_http_3( # TODO: Create connection cleanup and graceful shutdown cleanup = None - _run_server_forever( - loop, server.before_stop, server.after_stop, cleanup, None - ) + _run_server_forever(loop, server.before_stop, server.after_stop, cleanup, None) def _build_protocol_kwargs( diff --git a/sanic/server/socket.py b/sanic/server/socket.py index 2a77a1c6..6b006ad0 100644 --- a/sanic/server/socket.py +++ b/sanic/server/socket.py @@ -23,9 +23,7 @@ def bind_socket(host: str, port: int, *, backlog=100) -> socket.socket: try: # IP address: family must be specified for IPv6 at least ip = ip_address(host) host = str(ip) - sock = socket.socket( - socket.AF_INET6 if ip.version == 6 else socket.AF_INET - ) + sock = socket.socket(socket.AF_INET6 if ip.version == 6 else socket.AF_INET) except ValueError: # Hostname, may become AF_INET or AF_INET6 sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -92,9 +90,7 @@ def remove_unix_socket(path: str | None) -> None: pass -def configure_socket( - server_settings: dict[str, Any] -) -> socket.SocketType | None: +def configure_socket(server_settings: dict[str, Any]) -> socket.SocketType | None: # Create a listening socket or use the one in settings if server_settings.get("version") is HTTP.VERSION_3: return None diff --git a/sanic/server/websockets/frame.py b/sanic/server/websockets/frame.py index 0b8aa0fa..40dfbe4b 100644 --- a/sanic/server/websockets/frame.py +++ b/sanic/server/websockets/frame.py @@ -152,8 +152,7 @@ class WebsocketFrameAssembler: # and get_in_progress check, this exception is here # as a failsafe raise ServerError( - "Websocket get() found a message when " - "state was already fetched." + "Websocket get() found a message when " "state was already fetched." ) self.message_fetched.set() self.chunks = [] diff --git a/sanic/server/websockets/impl.py b/sanic/server/websockets/impl.py index c0eeb80f..d36c2972 100644 --- a/sanic/server/websockets/impl.py +++ b/sanic/server/websockets/impl.py @@ -152,12 +152,8 @@ class WebsocketImplProtocol: self.data_finished_fut = asyncio.shield(self.loop.create_future()) if self.ping_interval: - self.keepalive_ping_task = asyncio.create_task( - self.keepalive_ping() - ) - self.auto_closer_task = asyncio.create_task( - self.auto_close_connection() - ) + self.keepalive_ping_task = asyncio.create_task(self.keepalive_ping()) + self.auto_closer_task = asyncio.create_task(self.auto_close_connection()) async def wait_for_connection_lost(self, timeout=None) -> bool: """ @@ -246,9 +242,7 @@ class WebsocketImplProtocol: try: await asyncio.wait_for(ping_waiter, self.ping_timeout) except asyncio.TimeoutError: - error_logger.warning( - "Websocket timed out waiting for pong" - ) + error_logger.warning("Websocket timed out waiting for pong") self.fail_connection(1011) break except asyncio.CancelledError: @@ -278,9 +272,7 @@ class WebsocketImplProtocol: self.keepalive_ping_task = None if self.loop and self.io_proto and self.io_proto.transport: self.io_proto.transport.close() - self.loop.call_later( - self.close_timeout, self.io_proto.transport.abort - ) + self.loop.call_later(self.close_timeout, self.io_proto.transport.abort) # We were never open, or already closed return True @@ -318,9 +310,7 @@ class WebsocketImplProtocol: try: data_to_send = self.ws_proto.data_to_send() while ( - len(data_to_send) - and self.io_proto - and self.io_proto.transport + len(data_to_send) and self.io_proto and self.io_proto.transport ): frame_data = data_to_send.pop(0) self.io_proto.transport.write(frame_data) @@ -356,11 +346,7 @@ class WebsocketImplProtocol: self.ws_proto.send_close(code, reason) data_to_send.extend(self.ws_proto.data_to_send()) try: - while ( - len(data_to_send) - and self.io_proto - and self.io_proto.transport - ): + while len(data_to_send) and self.io_proto and self.io_proto.transport: frame_data = data_to_send.pop(0) self.io_proto.transport.write(frame_data) except Exception: @@ -392,15 +378,11 @@ class WebsocketImplProtocol: if self.data_finished_fut: try: await self.data_finished_fut - logger.debug( - "Websocket task finished. Closing the connection." - ) + logger.debug("Websocket task finished. Closing the connection.") except asyncio.CancelledError: # Cancelled error is called when data phase is cancelled # if an error occurred or the client closed the connection - logger.debug( - "Websocket handler cancelled. Closing the connection." - ) + logger.debug("Websocket handler cancelled. Closing the connection.") # Cancel the keepalive ping task. if self.keepalive_ping_task: @@ -426,10 +408,7 @@ class WebsocketImplProtocol: if (not self.io_proto) or (not self.io_proto.transport): # we were never open, or done. Can't do any finalization. return - elif ( - self.connection_lost_waiter - and self.connection_lost_waiter.done() - ): + elif self.connection_lost_waiter and self.connection_lost_waiter.done(): # connection confirmed closed already, proceed to abort waiter ... elif self.io_proto.transport.is_closing(): @@ -447,9 +426,7 @@ class WebsocketImplProtocol: if self.io_proto and self.io_proto.transport: self.io_proto.transport.abort() else: - if await self.wait_for_connection_lost( - timeout=self.close_timeout - ): + if await self.wait_for_connection_lost(timeout=self.close_timeout): # Connection aborted before the timeout expired. return error_logger.warning( @@ -731,8 +708,7 @@ class WebsocketImplProtocol: async with self.conn_mutex: if self.ws_proto.state in (CLOSED, CLOSING): raise WebsocketClosed( - "Cannot send a ping when the websocket interface " - "is closed." + "Cannot send a ping when the websocket interface " "is closed." ) if (not self.io_proto) or (not self.io_proto.loop): raise ServerError( @@ -747,9 +723,7 @@ class WebsocketImplProtocol: # Protect against duplicates if a payload is explicitly set. if data in self.pings: - raise ValueError( - "already waiting for a pong with the same data" - ) + raise ValueError("already waiting for a pong with the same data") # Generate a unique random payload otherwise. while data is None or data in self.pings: @@ -842,9 +816,7 @@ class WebsocketImplProtocol: self.ws_proto.receive_eof() data_to_send = self.ws_proto.data_to_send() events_to_process = self.ws_proto.events_received() - asyncio.create_task( - self.async_eof_received(data_to_send, events_to_process) - ) + asyncio.create_task(self.async_eof_received(data_to_send, events_to_process)) return False def connection_lost(self, exc): diff --git a/sanic/signals.py b/sanic/signals.py index 9fea88cf..999954dc 100644 --- a/sanic/signals.py +++ b/sanic/signals.py @@ -303,11 +303,7 @@ class SignalRouter(BaseRouter): def _build_event_parts(self, event: str) -> tuple[str, str, str]: parts = path_to_parts(event, self.delimiter) - if ( - len(parts) != 3 - or parts[0].startswith("<") - or parts[1].startswith("<") - ): + if len(parts) != 3 or parts[0].startswith("<") or parts[1].startswith("<"): raise InvalidSignal("Invalid signal event: %s" % event) if ( @@ -315,9 +311,7 @@ class SignalRouter(BaseRouter): and event not in RESERVED_NAMESPACES[parts[0]] and not (parts[2].startswith("<") and parts[2].endswith(">")) ): - raise InvalidSignal( - "Cannot declare reserved signal event: %s" % event - ) + raise InvalidSignal("Cannot declare reserved signal event: %s" % event) return parts def _clean_trigger(self, trigger: str) -> str: diff --git a/sanic/simple.py b/sanic/simple.py index 523f11a1..364104c5 100644 --- a/sanic/simple.py +++ b/sanic/simple.py @@ -11,8 +11,6 @@ def create_simple_server(directory: Path): ) app = Sanic("SimpleServer") - app.static( - "/", directory, name="main", directory_view=True, index="index.html" - ) + app.static("/", directory, name="main", directory_view=True, index="index.html") return app diff --git a/sanic/touchup/schemes/altsvc.py b/sanic/touchup/schemes/altsvc.py index 8fce4c35..5ea2c400 100644 --- a/sanic/touchup/schemes/altsvc.py +++ b/sanic/touchup/schemes/altsvc.py @@ -22,9 +22,7 @@ class RemoveAltSvc(NodeTransformer): def __init__(self, app: Sanic, verbosity: int = 0) -> None: self._app = app self._verbosity = verbosity - self._versions = { - info.settings["version"] for info in app.state.server_info - } + self._versions = {info.settings["version"] for info in app.state.server_info} def visit_Assign(self, node: Assign) -> Any: if any(self._matches(target) for target in node.targets): diff --git a/sanic/touchup/schemes/ode.py b/sanic/touchup/schemes/ode.py index ae51df72..15ef82e4 100644 --- a/sanic/touchup/schemes/ode.py +++ b/sanic/touchup/schemes/ode.py @@ -14,9 +14,7 @@ class OptionalDispatchEvent(BaseScheme): super().__init__(app) self._sync_events() - self._registered_events = [ - signal.name for signal in app.signal_router.routes - ] + self._registered_events = [signal.name for signal in app.signal_router.routes] def visitors(self) -> List[NodeTransformer]: return [RemoveDispatch(self._registered_events)] @@ -26,9 +24,7 @@ class OptionalDispatchEvent(BaseScheme): app_events = {} for app in self.app.__class__._app_registry.values(): if app.state.server_info: - app_events[app] = { - signal.name for signal in app.signal_router.routes - } + app_events[app] = {signal.name for signal in app.signal_router.routes} all_events.update(app_events[app]) for app, events in app_events.items(): diff --git a/sanic/types/shared_ctx.py b/sanic/types/shared_ctx.py index bf95ee65..77cd02a4 100644 --- a/sanic/types/shared_ctx.py +++ b/sanic/types/shared_ctx.py @@ -14,9 +14,7 @@ class SharedContext(SimpleNamespace): def __setattr__(self, name: str, value: Any) -> None: if self.is_locked: - raise RuntimeError( - f"Cannot set {name} on locked SharedContext object" - ) + raise RuntimeError(f"Cannot set {name} on locked SharedContext object") if not os.environ.get("SANIC_WORKER_NAME"): to_check: Iterable[Any] if not isinstance(value, (tuple, frozenset)): @@ -35,8 +33,7 @@ class SharedContext(SimpleNamespace): except AttributeError: module = "" if not any( - module.startswith(prefix) - for prefix in ("multiprocessing", "ctypes") + module.startswith(prefix) for prefix in ("multiprocessing", "ctypes") ): error_logger.warning( f"{Colors.YELLOW}Unsafe object {Colors.PURPLE}{name} " diff --git a/sanic/utils.py b/sanic/utils.py index 0ec9e5d2..4917fc92 100644 --- a/sanic/utils.py +++ b/sanic/utils.py @@ -80,9 +80,7 @@ def load_module_from_file_location( env_vars_in_location = set(re_findall(r"\${(.+?)}", location)) # B) Check these variables exists in environment. - not_defined_env_vars = env_vars_in_location.difference( - os_environ.keys() - ) + not_defined_env_vars = env_vars_in_location.difference(os_environ.keys()) if not_defined_env_vars: raise LoadFileException( "The following environment variables are not set: " @@ -91,18 +89,14 @@ def load_module_from_file_location( # C) Substitute them in location. for env_var in env_vars_in_location: - location = location.replace( - "${" + env_var + "}", os_environ[env_var] - ) + location = location.replace("${" + env_var + "}", os_environ[env_var]) location = str(location) if ".py" in location: name = location.split("/")[-1].split(".")[ 0 ] # get just the file name without path and .py extension - _mod_spec = spec_from_file_location( - name, location, *args, **kwargs - ) + _mod_spec = spec_from_file_location(name, location, *args, **kwargs) assert _mod_spec is not None # type assertion for mypy module = module_from_spec(_mod_spec) _mod_spec.loader.exec_module(module) # type: ignore diff --git a/sanic/worker/manager.py b/sanic/worker/manager.py index ff85fd81..47142f30 100644 --- a/sanic/worker/manager.py +++ b/sanic/worker/manager.py @@ -99,9 +99,7 @@ class WorkerManager: Worker: The Worker instance """ # noqa: E501 container = self.transient if transient else self.durable - worker = Worker( - ident, func, kwargs, self.context, self.worker_state, workers - ) + worker = Worker(ident, func, kwargs, self.context, self.worker_state, workers) container[worker.ident] = worker return worker @@ -204,9 +202,7 @@ class WorkerManager: change = num_worker - self.num_server if change == 0: - logger.info( - f"No change needed. There are already {num_worker} workers." - ) + logger.info(f"No change needed. There are already {num_worker} workers.") return logger.info(f"Scaling from {self.num_server} to {num_worker} workers") @@ -237,9 +233,7 @@ class WorkerManager: try: if self.monitor_subscriber.poll(0.1): message = self.monitor_subscriber.recv() - logger.debug( - f"Monitor message: {message}", extra={"verbosity": 2} - ) + logger.debug(f"Monitor message: {message}", extra={"verbosity": 2}) if not message: break elif message == "__TERMINATE__": @@ -258,9 +252,7 @@ class WorkerManager: reloaded_files = ( split_message[1] if len(split_message) > 1 else None ) - process_names = [ - name.strip() for name in processes.split(",") - ] + process_names = [name.strip() for name in processes.split(",")] if "__ALL_PROCESSES__" in process_names: process_names = None order = ( diff --git a/sanic/worker/multiplexer.py b/sanic/worker/multiplexer.py index b877ccc1..c52a8d3d 100644 --- a/sanic/worker/multiplexer.py +++ b/sanic/worker/multiplexer.py @@ -54,8 +54,7 @@ class WorkerMultiplexer: """ if name and all_workers: raise ValueError( - "Ambiguous restart with both a named process and" - " all_workers=True" + "Ambiguous restart with both a named process and" " all_workers=True" ) if not name: name = "__ALL_PROCESSES__:" if all_workers else self.name diff --git a/sanic/worker/process.py b/sanic/worker/process.py index 9bf0df42..2de9da96 100644 --- a/sanic/worker/process.py +++ b/sanic/worker/process.py @@ -29,9 +29,7 @@ class WorkerProcess: self.kwargs = kwargs self.worker_state = worker_state if self.name not in self.worker_state: - self.worker_state[self.name] = { - "server": self.SERVER_LABEL in self.name - } + self.worker_state[self.name] = {"server": self.SERVER_LABEL in self.name} self.spawn() def set_state(self, state: ProcessState, force=False): @@ -94,9 +92,7 @@ class WorkerProcess: self._terminate_now() else: self._old_process = self._current_process - self.kwargs.update( - {"config": {k.upper(): v for k, v in kwargs.items()}} - ) + self.kwargs.update({"config": {k.upper(): v for k, v in kwargs.items()}}) try: self.spawn() self.start() diff --git a/sanic/worker/serve.py b/sanic/worker/serve.py index d808c95b..0844f36b 100644 --- a/sanic/worker/serve.py +++ b/sanic/worker/serve.py @@ -27,9 +27,7 @@ def worker_serve( app_loader: AppLoader, worker_state: Optional[Dict[str, Any]] = None, server_info: Optional[Dict[str, List[ApplicationServerInfo]]] = None, - ssl: Optional[ - Union[SSLContext, Dict[str, Union[str, os.PathLike]]] - ] = None, + ssl: Optional[Union[SSLContext, Dict[str, Union[str, os.PathLike]]]] = None, sock: Optional[socket.socket] = None, unix: Optional[str] = None, reuse_port: bool = False, @@ -86,9 +84,7 @@ def worker_serve( # Hydrate apps with any passed server info if monitor_publisher is None: - raise RuntimeError( - "No restart publisher found in worker process" - ) + raise RuntimeError("No restart publisher found in worker process") if worker_state is None: raise RuntimeError("No worker state found in worker process") @@ -96,9 +92,7 @@ def worker_serve( apps = list(Sanic._app_registry.values()) app.before_server_start(partial(app._start_servers, apps=apps)) for a in apps: - a.multiplexer = WorkerMultiplexer( - monitor_publisher, worker_state - ) + a.multiplexer = WorkerMultiplexer(monitor_publisher, worker_state) if app.debug: loop.set_debug(app.debug) diff --git a/sanic/worker/state.py b/sanic/worker/state.py index 07103a5d..ae14ead8 100644 --- a/sanic/worker/state.py +++ b/sanic/worker/state.py @@ -62,9 +62,7 @@ class WorkerState(Mapping): def update(self, mapping: MappingType[str, Any]) -> None: if any(k in self.RESTRICTED for k in mapping.keys()): - self._write_error( - [k for k in mapping.keys() if k in self.RESTRICTED] - ) + self._write_error([k for k in mapping.keys() if k in self.RESTRICTED]) self._state[self._name] = { **self._state[self._name], **mapping, diff --git a/scripts/changelog.py b/scripts/changelog.py index 97df43ba..88059d60 100755 --- a/scripts/changelog.py +++ b/scripts/changelog.py @@ -22,9 +22,7 @@ if __name__ == "__main__": help="Render the news fragments, don't write to files, " "don't check versions.", ) - @click.option( - "--dir", "directory", default=path.dirname(path.abspath(__file__)) - ) + @click.option("--dir", "directory", default=path.dirname(path.abspath(__file__))) @click.option("--name", "project_name", default=None) @click.option( "--version", diff --git a/scripts/release.py b/scripts/release.py index 0d920bdb..9664c73a 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -25,8 +25,7 @@ GIT_COMMANDS = { ], "push_tag": ["git push origin {new_version}"], "get_change_log": [ - 'git log --no-merges --pretty=format:"%h::: %cn::: %s" ' - "{current_version}.." + 'git log --no-merges --pretty=format:"%h::: %cn::: %s" ' "{current_version}.." ], } @@ -72,9 +71,7 @@ class Directory: def _run_shell_command(command: list): try: - process = Popen( - command, stderr=PIPE, stdout=PIPE, stdin=PIPE, shell=True - ) + process = Popen(command, stderr=PIPE, stdout=PIPE, stdin=PIPE, shell=True) output, error = process.communicate() return_code = process.returncode return output.decode("utf-8"), error, return_code @@ -143,9 +140,9 @@ def _update_release_version_for_sanic( current_version_line = config_parser.get( "version", "current_version_pattern" ).format(current_version=current_version) - new_version_line = config_parser.get( - "version", "new_version_pattern" - ).format(new_version=new_version) + new_version_line = config_parser.get("version", "new_version_pattern").format( + new_version=new_version + ) for version_file in version_files.split(","): with open(version_file) as init_file: diff --git a/setup.py b/setup.py index 7b91d284..5a8608c5 100644 --- a/setup.py +++ b/setup.py @@ -59,9 +59,7 @@ def str_to_bool(val: str) -> bool: with open_local(["sanic", "__version__.py"], encoding="latin1") as fp: try: - version = re.findall( - r"^__version__ = \"([^']+)\"\r?$", fp.read(), re.M - )[0] + version = re.findall(r"^__version__ = \"([^']+)\"\r?$", fp.read(), re.M)[0] except IndexError: raise RuntimeError("Unable to determine version.") @@ -96,9 +94,7 @@ setup_kwargs = { "entry_points": {"console_scripts": ["sanic = sanic.__main__:main"]}, } -env_dependency = ( - '; sys_platform != "win32" and implementation_name == "cpython"' -) +env_dependency = '; sys_platform != "win32" and implementation_name == "cpython"' ujson = "ujson>=1.35" + env_dependency uvloop = "uvloop>=0.15.0" + env_dependency types_ujson = "types-ujson" + env_dependency diff --git a/tests/benchmark/test_route_resolution_benchmark.py b/tests/benchmark/test_route_resolution_benchmark.py index 8405f4a0..f4bbd67b 100644 --- a/tests/benchmark/test_route_resolution_benchmark.py +++ b/tests/benchmark/test_route_resolution_benchmark.py @@ -16,9 +16,7 @@ class TestSanicRouteResolution: async def test_resolve_route_no_arg_string_path( self, sanic_router, route_generator, benchmark ): - simple_routes = route_generator.generate_random_direct_route( - max_route_depth=4 - ) + simple_routes = route_generator.generate_random_direct_route(max_route_depth=4) router, simple_routes = sanic_router(route_details=simple_routes) route_to_call = choice(simple_routes) request = Request( @@ -52,9 +50,7 @@ class TestSanicRouteResolution: ) router, typed_routes = sanic_router(route_details=typed_routes) route_to_call = choice(typed_routes) - url = route_generator.generate_url_for_template( - template=route_to_call[-1] - ) + url = route_generator.generate_url_for_template(template=route_to_call[-1]) print(f"{route_to_call[-1]} -> {url}") request = Request( diff --git a/tests/certs/createcerts.py b/tests/certs/createcerts.py index 34415961..f1c6a97e 100644 --- a/tests/certs/createcerts.py +++ b/tests/certs/createcerts.py @@ -51,9 +51,7 @@ def selfsigned(key, common_name, san): .not_valid_before(datetime.utcnow()) .not_valid_after(datetime.utcnow() + timedelta(days=365.25 * 8)) .add_extension( - KeyUsage( - True, False, False, False, False, False, False, False, False - ), + KeyUsage(True, False, False, False, False, False, False, False, False), critical=True, ) .add_extension( diff --git a/tests/client.py b/tests/client.py index 6a9f3e6e..e73da412 100644 --- a/tests/client.py +++ b/tests/client.py @@ -13,9 +13,7 @@ class RawClient: self.port = port async def connect(self): - self.reader, self.writer = await asyncio.open_connection( - self.host, self.port - ) + self.reader, self.writer = await asyncio.open_connection(self.host, self.port) async def close(self): self.writer.close() @@ -39,8 +37,4 @@ class RawClient: return await self.reader.read(nbytes) def _clean(self, message: str) -> str: - return ( - dedent(message) - .lstrip("\n") - .replace("\n", self.CRLF.decode("utf-8")) - ) + return dedent(message).lstrip("\n").replace("\n", self.CRLF.decode("utf-8")) diff --git a/tests/conftest.py b/tests/conftest.py index c6523797..1a6127a4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,14 +42,10 @@ async def _handler(request): TYPE_TO_GENERATOR_MAP = { - "str": lambda: "".join( - [random.choice(string.ascii_lowercase) for _ in range(4)] - ), + "str": lambda: "".join([random.choice(string.ascii_lowercase) for _ in range(4)]), "int": lambda: random.choice(range(1000000)), "float": lambda: random.random(), - "alpha": lambda: "".join( - [random.choice(string.ascii_lowercase) for _ in range(4)] - ), + "alpha": lambda: "".join([random.choice(string.ascii_lowercase) for _ in range(4)]), "uuid": lambda: str(uuid.uuid1()), } diff --git a/tests/http3/test_http_receiver.py b/tests/http3/test_http_receiver.py index 0bed7241..51b1e959 100644 --- a/tests/http3/test_http_receiver.py +++ b/tests/http3/test_http_receiver.py @@ -84,9 +84,7 @@ async def test_http_receiver_run_request(app: Sanic, http_request: Request): app.__class__ = mock_handle receiver = generate_http_receiver(app, http_request) - receiver.protocol.quic_event_received( - ProtocolNegotiated(alpn_protocol="h3") - ) + receiver.protocol.quic_event_received(ProtocolNegotiated(alpn_protocol="h3")) await receiver.run() handler.assert_awaited_once_with(receiver.request) @@ -99,9 +97,7 @@ async def test_http_receiver_run_exception(app: Sanic, http_request: Request): app.__class__ = mock_handle receiver = generate_http_receiver(app, http_request) - receiver.protocol.quic_event_received( - ProtocolNegotiated(alpn_protocol="h3") - ) + receiver.protocol.quic_event_received(ProtocolNegotiated(alpn_protocol="h3")) exception = Exception("Oof") await receiver.run(exception) handler.assert_awaited_once_with(receiver.request, exception) @@ -139,9 +135,7 @@ def test_http_receiver_receive_body(app: Sanic, http_request: Request): receiver.receive_body(b"..") assert receiver.request.body == b"...." - with pytest.raises( - PayloadTooLarge, match="Request body exceeds the size limit" - ): + with pytest.raises(PayloadTooLarge, match="Request body exceeds the size limit"): receiver.receive_body(b"..") @@ -176,17 +170,13 @@ async def test_send_headers(app: Sanic, http_request: Request): send_headers_mock = Mock() existing_send_headers = H3Connection.send_headers receiver = generate_http_receiver(app, http_request) - receiver.protocol.quic_event_received( - ProtocolNegotiated(alpn_protocol="h3") - ) + receiver.protocol.quic_event_received(ProtocolNegotiated(alpn_protocol="h3")) http_request._protocol = receiver.protocol def send_headers(*args, **kwargs): send_headers_mock(*args, **kwargs) - return existing_send_headers( - receiver.protocol.connection, *args, **kwargs - ) + return existing_send_headers(receiver.protocol.connection, *args, **kwargs) receiver.protocol.connection.send_headers = send_headers receiver.head_only = False @@ -310,10 +300,7 @@ def test_request_header_encoding(app): ) ) assert exc_info.value.status_code == 400 - assert ( - str(exc_info.value) - == "Header names may only contain US-ASCII characters." - ) + assert str(exc_info.value) == "Header names may only contain US-ASCII characters." def test_request_url_encoding(app): diff --git a/tests/performance/sanic/http_response.py b/tests/performance/sanic/http_response.py index 6e845e79..57046454 100644 --- a/tests/performance/sanic/http_response.py +++ b/tests/performance/sanic/http_response.py @@ -5,9 +5,7 @@ import timeit from sanic.response import json -currentdir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe())) -) +currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) sys.path.insert(0, currentdir + "/../../../") diff --git a/tests/performance/sanic/simple_server.py b/tests/performance/sanic/simple_server.py index 976c47c1..ffb6566e 100644 --- a/tests/performance/sanic/simple_server.py +++ b/tests/performance/sanic/simple_server.py @@ -5,9 +5,7 @@ import sys from sanic import Sanic from sanic.response import json -currentdir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe())) -) +currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) sys.path.insert(0, currentdir + "/../../../") diff --git a/tests/performance/sanic/varied_server.py b/tests/performance/sanic/varied_server.py index fa6a8084..b5be1c39 100644 --- a/tests/performance/sanic/varied_server.py +++ b/tests/performance/sanic/varied_server.py @@ -6,9 +6,7 @@ from sanic import Sanic from sanic.exceptions import ServerError from sanic.response import json, text -currentdir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe())) -) +currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) sys.path.insert(0, currentdir + "/../../../") diff --git a/tests/test_app.py b/tests/test_app.py index 575428cc..5f5fa3c2 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -97,9 +97,7 @@ def test_create_server_no_startup(app: Sanic): asyncio_server_kwargs={"start_serving": False}, ) srv = loop.run_until_complete(asyncio_srv_coro) - message = ( - "Cannot run Sanic server without first running await server.startup()" - ) + message = "Cannot run Sanic server without first running await server.startup()" with pytest.raises(SanicException, match=message): loop.run_until_complete(srv.start_serving()) @@ -212,14 +210,8 @@ def test_app_websocket_parameters(websocket_protocol_mock, app: Sanic): websocket_protocol_call_args = websocket_protocol_mock.call_args ws_kwargs = websocket_protocol_call_args[1] assert ws_kwargs["websocket_max_size"] == app.config.WEBSOCKET_MAX_SIZE - assert ( - ws_kwargs["websocket_ping_timeout"] - == app.config.WEBSOCKET_PING_TIMEOUT - ) - assert ( - ws_kwargs["websocket_ping_interval"] - == app.config.WEBSOCKET_PING_INTERVAL - ) + assert ws_kwargs["websocket_ping_timeout"] == app.config.WEBSOCKET_PING_TIMEOUT + assert ws_kwargs["websocket_ping_interval"] == app.config.WEBSOCKET_PING_INTERVAL def test_handle_request_with_nested_exception(app: Sanic, monkeypatch): @@ -228,9 +220,7 @@ def test_handle_request_with_nested_exception(app: Sanic, monkeypatch): def mock_error_handler_response(*args, **kwargs): raise Exception(err_msg) - monkeypatch.setattr( - app.error_handler, "response", mock_error_handler_response - ) + monkeypatch.setattr(app.error_handler, "response", mock_error_handler_response) @app.get("/") def handler(request): @@ -247,9 +237,7 @@ def test_handle_request_with_nested_exception_debug(app: Sanic, monkeypatch): def mock_error_handler_response(*args, **kwargs): raise Exception(err_msg) - monkeypatch.setattr( - app.error_handler, "response", mock_error_handler_response - ) + monkeypatch.setattr(app.error_handler, "response", mock_error_handler_response) @app.get("/") def handler(request): @@ -263,15 +251,11 @@ def test_handle_request_with_nested_exception_debug(app: Sanic, monkeypatch): ) -def test_handle_request_with_nested_sanic_exception( - app: Sanic, monkeypatch, caplog -): +def test_handle_request_with_nested_sanic_exception(app: Sanic, monkeypatch, caplog): def mock_error_handler_response(*args, **kwargs): raise SanicException("Mock SanicException") - monkeypatch.setattr( - app.error_handler, "response", mock_error_handler_response - ) + monkeypatch.setattr(app.error_handler, "response", mock_error_handler_response) @app.get("/") def handler(request): @@ -326,9 +310,7 @@ def test_app_registry_wrong_type(): def test_app_registry_name_reuse(): Sanic("test") Sanic.test_mode = False - with pytest.raises( - SanicException, match='Sanic app name "test" already in use.' - ): + with pytest.raises(SanicException, match='Sanic app name "test" already in use.'): Sanic("test") Sanic.test_mode = True Sanic("test") @@ -361,9 +343,7 @@ def test_get_app_does_not_exist(): def test_get_app_does_not_exist_force_create(): - assert isinstance( - Sanic.get_app("does-not-exist", force_create=True), Sanic - ) + assert isinstance(Sanic.get_app("does-not-exist", force_create=True), Sanic) def test_get_app_default(): @@ -372,9 +352,7 @@ def test_get_app_default(): def test_get_app_no_default(): - with pytest.raises( - SanicException, match="No Sanic apps have been registered." - ): + with pytest.raises(SanicException, match="No Sanic apps have been registered."): Sanic.get_app() @@ -383,9 +361,7 @@ def test_get_app_default_ambiguous(): Sanic("test2") with pytest.raises( SanicException, - match=re.escape( - 'Multiple Sanic apps found, use Sanic.get_app("app_name")' - ), + match=re.escape('Multiple Sanic apps found, use Sanic.get_app("app_name")'), ): Sanic.get_app() @@ -417,8 +393,7 @@ def test_bad_custom_config(): with pytest.raises( SanicException, match=( - "When instantiating Sanic with config, you cannot also pass " - "env_prefix" + "When instantiating Sanic with config, you cannot also pass " "env_prefix" ), ): Sanic("test", config=1, env_prefix=1) @@ -500,9 +475,7 @@ def test_uvloop_cannot_never_called_with_create_server(caplog, monkeypatch): ) counter = Counter([(r[1], r[2]) for r in caplog.record_tuples]) - modified = sum( - 1 for app in apps if not isinstance(app.config.USE_UVLOOP, Default) - ) + modified = sum(1 for app in apps if not isinstance(app.config.USE_UVLOOP, Default)) assert counter[(logging.WARNING, message)] == modified @@ -559,12 +532,8 @@ def test_no_workers(app: Sanic): {"auto_reload": True}, ), ) -def test_cannot_run_single_process_and_workers_or_auto_reload( - app: Sanic, extra -): - message = ( - "Single process cannot be run with multiple workers or auto-reload" - ) +def test_cannot_run_single_process_and_workers_or_auto_reload(app: Sanic, extra): + message = "Single process cannot be run with multiple workers or auto-reload" with pytest.raises(RuntimeError, match=message): app.run(single_process=True, **extra) diff --git a/tests/test_asgi.py b/tests/test_asgi.py index 111d7e12..c8134b84 100644 --- a/tests/test_asgi.py +++ b/tests/test_asgi.py @@ -352,9 +352,7 @@ async def test_websocket_bytes_receive(send, receive, message_stack): @pytest.mark.asyncio -async def test_websocket_accept_with_no_subprotocols( - send, receive, message_stack -): +async def test_websocket_accept_with_no_subprotocols(send, receive, message_stack): ws = WebSocketConnection(send, receive) await ws.accept() diff --git a/tests/test_blueprint_group.py b/tests/test_blueprint_group.py index 06472af4..1c51d4c5 100644 --- a/tests/test_blueprint_group.py +++ b/tests/test_blueprint_group.py @@ -28,9 +28,7 @@ def test_bp_group_with_additional_route_params(app: Sanic): blueprint_1 = Blueprint("blueprint_1", url_prefix="/bp1") blueprint_2 = Blueprint("blueprint_2", url_prefix="/bp2") - @blueprint_1.route( - "/request_path", methods=frozenset({"PUT", "POST"}), version=2 - ) + @blueprint_1.route("/request_path", methods=frozenset({"PUT", "POST"}), version=2) def blueprint_1_v2_method_with_put_and_post(request: Request): if request.method == "PUT": return text("PUT_OK") @@ -46,9 +44,7 @@ def test_bp_group_with_additional_route_params(app: Sanic): elif request.method == "PATCH": return text(f"PATCH_{param}") - blueprint_group = Blueprint.group( - blueprint_1, blueprint_2, url_prefix="/api" - ) + blueprint_group = Blueprint.group(blueprint_1, blueprint_2, url_prefix="/api") @blueprint_group.middleware("request") def authenticate_request(request: Request): @@ -68,15 +64,11 @@ def test_bp_group_with_additional_route_params(app: Sanic): app.blueprint(blueprint_group) header = {"authorization": " ".join(["Basic", AUTH])} - _, response = app.test_client.put( - "/v2/api/bp1/request_path", headers=header - ) + _, response = app.test_client.put("/v2/api/bp1/request_path", headers=header) assert response.text == "PUT_OK" assert response.headers.get("x-test-middleware") == "value" - _, response = app.test_client.post( - "/v2/api/bp1/request_path", headers=header - ) + _, response = app.test_client.post("/v2/api/bp1/request_path", headers=header) assert response.text == "POST_OK" _, response = app.test_client.delete("/api/bp2/route/bp2", headers=header) @@ -109,9 +101,7 @@ def test_bp_group(app: Sanic): def blueprint_2_error(request: Request): raise ServerError("Error") - blueprint_group_1 = Blueprint.group( - blueprint_1, blueprint_2, url_prefix="/bp" - ) + blueprint_group_1 = Blueprint.group(blueprint_1, blueprint_2, url_prefix="/bp") blueprint_3 = Blueprint("blueprint_3", url_prefix="/bp3") @@ -213,9 +203,7 @@ def test_bp_group_list_operations(app: Sanic): def blueprint_2_default_route(request): return text("BP2_OK") - blueprint_group_1 = Blueprint.group( - blueprint_1, blueprint_2, url_prefix="/bp" - ) + blueprint_group_1 = Blueprint.group(blueprint_1, blueprint_2, url_prefix="/bp") blueprint_3 = Blueprint("blueprint_2", url_prefix="/bp3") @@ -247,9 +235,7 @@ def test_bp_group_as_list(): def test_bp_group_as_nested_group(): blueprint_1 = Blueprint("blueprint_1", url_prefix="/bp1") blueprint_2 = Blueprint("blueprint_2", url_prefix="/bp2") - blueprint_group_1 = Blueprint.group( - Blueprint.group(blueprint_1, blueprint_2) - ) + blueprint_group_1 = Blueprint.group(Blueprint.group(blueprint_1, blueprint_2)) assert len(blueprint_group_1) == 1 @@ -259,9 +245,7 @@ def test_blueprint_group_insert(): ) blueprint_2 = Blueprint("blueprint_2", url_prefix="/bp2") blueprint_3 = Blueprint("blueprint_3", url_prefix=None) - group = BlueprintGroup( - url_prefix="/test", version=1.3, strict_slashes=False - ) + group = BlueprintGroup(url_prefix="/test", version=1.3, strict_slashes=False) group.insert(0, blueprint_1) group.insert(0, blueprint_2) group.insert(0, blueprint_3) @@ -350,12 +334,8 @@ async def test_multiple_nested_bp_group(): bp1.add_route(lambda _: ..., "/", name="route1") bp2.add_route(lambda _: ..., "/", name="route2") - group_a = Blueprint.group( - bp1, bp2, url_prefix="/group-a", name_prefix="group-a" - ) - group_b = Blueprint.group( - bp1, bp2, url_prefix="/group-b", name_prefix="group-b" - ) + group_a = Blueprint.group(bp1, bp2, url_prefix="/group-a", name_prefix="group-a") + group_b = Blueprint.group(bp1, bp2, url_prefix="/group-b", name_prefix="group-b") app = Sanic("PropTest") app.blueprint(group_a) diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 3bfc4386..7f5bcdab 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -751,9 +751,7 @@ def test_bp_group_with_default_url_prefix(app: Sanic): def api_v1_info(request): return text("api_version: v1") - bp_api_v1_group = Blueprint.group( - bp_api_v1, bp_resources_group, url_prefix="/v1" - ) + bp_api_v1_group = Blueprint.group(bp_api_v1, bp_resources_group, url_prefix="/v1") bp_api_group = Blueprint.group(bp_api_v1_group, url_prefix="/api") app.blueprint(bp_api_group) @@ -794,9 +792,7 @@ def test_blueprint_middleware_with_args(app: Sanic): ) assert response.text == "value" - _, response = app.test_client.get( - "/wa", headers={"content-type": "plain/text"} - ) + _, response = app.test_client.get("/wa", headers={"content-type": "plain/text"}) assert response.json.get("test") == "value" @@ -985,13 +981,9 @@ def test_blueprint_group_strict_slashes(): app = Sanic(name="blueprint-group-test") bp1 = Blueprint(name="bp1", url_prefix=None, strict_slashes=False) - bp2 = Blueprint( - name="bp2", version=3, url_prefix="/bp2", strict_slashes=None - ) + bp2 = Blueprint(name="bp2", version=3, url_prefix="/bp2", strict_slashes=None) - bp3 = Blueprint( - name="bp3", version=None, url_prefix="/bp3/", strict_slashes=None - ) + bp3 = Blueprint(name="bp3", version=None, url_prefix="/bp3/", strict_slashes=None) @bp1.get("/r1") async def bp1_r1(request): diff --git a/tests/test_config.py b/tests/test_config.py index 17bd488e..bb8780d0 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -133,9 +133,7 @@ def test_add_converter_multiple_times(caplog): def converter(): ... - message = ( - "Configuration value converter 'converter' has already been registered" - ) + message = "Configuration value converter 'converter' has already been registered" config = Config() config.register_type(converter) with caplog.at_level(logging.WARNING): @@ -306,14 +304,10 @@ async def test_config_access_log_passing_in_create_server(app: Sanic): async def _request(sanic, loop): app.stop() - await app.create_server( - port=1341, access_log=False, return_asyncio_server=True - ) + await app.create_server(port=1341, access_log=False, return_asyncio_server=True) assert app.config.ACCESS_LOG is False - await app.create_server( - port=1342, access_log=True, return_asyncio_server=True - ) + await app.create_server(port=1342, access_log=True, return_asyncio_server=True) assert app.config.ACCESS_LOG is True @@ -334,9 +328,7 @@ def test_config_rewrite_keep_alive(): _test_setting_as_dict = {"TEST_SETTING_VALUE": 1} _test_setting_as_class = type("C", (), {"TEST_SETTING_VALUE": 1}) -_test_setting_as_module = str( - Path(__file__).parent / "static/app_test_config.py" -) +_test_setting_as_module = str(Path(__file__).parent / "static/app_test_config.py") @pytest.mark.parametrize( diff --git a/tests/test_cookies.py b/tests/test_cookies.py index 544300ac..4caa13af 100644 --- a/tests/test_cookies.py +++ b/tests/test_cookies.py @@ -42,9 +42,7 @@ async def test_cookies_asgi(app): response.cookies["right_back"] = "at you" return response - request, response = await app.asgi_client.get( - "/", cookies={"test": "working!"} - ) + request, response = await app.asgi_client.get("/", cookies={"test": "working!"}) response_cookies = SimpleCookie() response_cookies.load(response.headers.get("set-cookie", {})) @@ -101,9 +99,7 @@ def test_cookie_options(app): response = text("OK") response.cookies["test"] = "at you" response.cookies["test"]["httponly"] = True - response.cookies["test"]["expires"] = datetime.now() + timedelta( - seconds=10 - ) + response.cookies["test"]["expires"] = datetime.now() + timedelta(seconds=10) return response request, response = app.test_client.get("/") @@ -179,17 +175,11 @@ def test_cookie_max_age(app, max_age): response.cookies["test"]["max-age"] = max_age return response - request, response = app.test_client.get( - "/", cookies=cookies, raw_cookies=True - ) + request, response = app.test_client.get("/", cookies=cookies, raw_cookies=True) assert response.status == 200 cookie = response.cookies.get("test") - if ( - str(max_age).isdigit() - and int(max_age) == float(max_age) - and int(max_age) != 0 - ): + if str(max_age).isdigit() and int(max_age) == float(max_age) and int(max_age) != 0: cookie_expires = datetime.utcfromtimestamp( response.raw_cookies["test"].expires ).replace(microsecond=0) @@ -202,9 +192,8 @@ def test_cookie_max_age(app, max_age): ) assert cookie == "pass" - assert ( - cookie_expires == expires - or cookie_expires == expires + timedelta(seconds=-1) + assert cookie_expires == expires or cookie_expires == expires + timedelta( + seconds=-1 ) else: assert cookie is None @@ -221,9 +210,7 @@ def test_cookie_bad_max_age(app, max_age): response.cookies["test"]["max-age"] = max_age return response - request, response = app.test_client.get( - "/", cookies=cookies, raw_cookies=True - ) + request, response = app.test_client.get("/", cookies=cookies, raw_cookies=True) assert response.status == 500 @@ -239,9 +226,7 @@ def test_cookie_expires(app: Sanic, expires: timedelta): response.cookies["test"]["expires"] = expires_time return response - request, response = app.test_client.get( - "/", cookies=cookies, raw_cookies=True - ) + request, response = app.test_client.get("/", cookies=cookies, raw_cookies=True) cookie_expires = datetime.utcfromtimestamp( response.raw_cookies["test"].expires @@ -399,17 +384,13 @@ def test_bad_cookie_prarms(): ServerError, match="Cannot set host_prefix on a cookie unless path='/'", ): - jar.add_cookie( - "foo", "bar", host_prefix=True, secure=True, path="/foo" - ) + jar.add_cookie("foo", "bar", host_prefix=True, secure=True, path="/foo") with pytest.raises( ServerError, match="Cannot set host_prefix on a cookie with a defined domain", ): - jar.add_cookie( - "foo", "bar", host_prefix=True, secure=True, domain="foo.bar" - ) + jar.add_cookie("foo", "bar", host_prefix=True, secure=True, domain="foo.bar") with pytest.raises( ServerError, diff --git a/tests/test_errorpages.py b/tests/test_errorpages.py index 440677c9..1953162d 100644 --- a/tests/test_errorpages.py +++ b/tests/test_errorpages.py @@ -544,9 +544,7 @@ def test_guess_mime_logging( with caplog.at_level(logging.DEBUG, logger="sanic.root"): guess_mime(fake_request, fallback) - (logmsg,) = ( - r.message for r in caplog.records if r.funcName == "guess_mime" - ) + (logmsg,) = (r.message for r in caplog.records if r.funcName == "guess_mime") assert logmsg == expected @@ -564,9 +562,7 @@ def test_exception_header_on_renderers(app: Sanic, format, expected): @app.get("/test") def test(request): - raise SanicException( - "test", status_code=400, headers={"exception": "test"} - ) + raise SanicException("test", status_code=400, headers={"exception": "test"}) _, response = app.test_client.get("/test") assert response.status == 400 diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index 0fec0079..eb27d143 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -198,9 +198,7 @@ def test_handled_unhandled_exception(exception_app): def test_exception_in_exception_handler(exception_app): """Test that an exception thrown in an error handler is handled""" - request, response = exception_app.test_client.get( - "/error_in_error_handler_handler" - ) + request, response = exception_app.test_client.get("/error_in_error_handler_handler") assert response.status == 500 assert response.body == b"An error occurred while handling an error" @@ -284,15 +282,9 @@ def test_contextual_exception_context(debug): def fail(): raise TeapotError(context={"foo": "bar"}) - app.post("/coffee/json", error_format="json", name="json")( - lambda _: fail() - ) - app.post("/coffee/html", error_format="html", name="html")( - lambda _: fail() - ) - app.post("/coffee/text", error_format="text", name="text")( - lambda _: fail() - ) + app.post("/coffee/json", error_format="json", name="json")(lambda _: fail()) + app.post("/coffee/html", error_format="html", name="html")(lambda _: fail()) + app.post("/coffee/text", error_format="text", name="text")(lambda _: fail()) _, response = app.test_client.post("/coffee/json", debug=debug) assert response.status == 418 @@ -328,15 +320,9 @@ def test_contextual_exception_extra(debug): def fail(): raise TeapotError(extra={"foo": "bar"}) - app.post("/coffee/json", error_format="json", name="json")( - lambda _: fail() - ) - app.post("/coffee/html", error_format="html", name="html")( - lambda _: fail() - ) - app.post("/coffee/text", error_format="text", name="text")( - lambda _: fail() - ) + app.post("/coffee/json", error_format="json", name="json")(lambda _: fail()) + app.post("/coffee/html", error_format="html", name="html")(lambda _: fail()) + app.post("/coffee/text", error_format="text", name="text")(lambda _: fail()) _, response = app.test_client.post("/coffee/json", debug=debug) assert response.status == 418 diff --git a/tests/test_exceptions_handler.py b/tests/test_exceptions_handler.py index ed2621eb..1adff20f 100644 --- a/tests/test_exceptions_handler.py +++ b/tests/test_exceptions_handler.py @@ -133,9 +133,7 @@ def test_inherited_exception_handler(exception_handler_app: Sanic): def test_chained_exception_handler(exception_handler_app: Sanic): - request, response = exception_handler_app.test_client.get( - "/6/0", debug=True - ) + request, response = exception_handler_app.test_client.get("/6/0", debug=True) assert response.status == 500 soup = BeautifulSoup(response.body, "html.parser") @@ -182,20 +180,14 @@ def test_exception_handler_lookup(exception_handler_app: Sanic): assert handler.lookup(ModuleNotFoundError(), None) == import_error_handler assert handler.lookup(CustomError(), None) == custom_error_handler assert handler.lookup(ServerError("Error"), None) == server_error_handler - assert ( - handler.lookup(CustomServerError("Error"), None) - == server_error_handler - ) + assert handler.lookup(CustomServerError("Error"), None) == server_error_handler # once again to ensure there is no caching bug assert handler.lookup(ImportError(), None) == import_error_handler assert handler.lookup(ModuleNotFoundError(), None) == import_error_handler assert handler.lookup(CustomError(), None) == custom_error_handler assert handler.lookup(ServerError("Error"), None) == server_error_handler - assert ( - handler.lookup(CustomServerError("Error"), None) - == server_error_handler - ) + assert handler.lookup(CustomServerError("Error"), None) == server_error_handler def test_exception_handler_processed_request_middleware( diff --git a/tests/test_ext_integration.py b/tests/test_ext_integration.py index a837ee12..e2340e25 100644 --- a/tests/test_ext_integration.py +++ b/tests/test_ext_integration.py @@ -62,9 +62,7 @@ def test_extend_cannot_be_called_multiple_times(app: Sanic, sanic_ext): ) def test_fail_if_not_loaded(app: Sanic): del sys.modules["sanic_ext"] - with pytest.raises( - RuntimeError, match="Sanic Extensions is not installed.*" - ): + with pytest.raises(RuntimeError, match="Sanic Extensions is not installed.*"): app.extend(built_in_extensions=False) diff --git a/tests/test_graceful_shutdown.py b/tests/test_graceful_shutdown.py index 9befbba4..fcc9958f 100644 --- a/tests/test_graceful_shutdown.py +++ b/tests/test_graceful_shutdown.py @@ -8,9 +8,7 @@ from sanic.response import empty PORT = 42101 -def test_no_exceptions_when_cancel_pending_request( - app, caplog: LogCaptureFixture -): +def test_no_exceptions_when_cancel_pending_request(app, caplog: LogCaptureFixture): app.config.GRACEFUL_SHUTDOWN_TIMEOUT = 1 @app.get("/") diff --git a/tests/test_headers.py b/tests/test_headers.py index 6dbe234f..1f74cfb0 100644 --- a/tests/test_headers.py +++ b/tests/test_headers.py @@ -243,9 +243,7 @@ def test_accept_parsed_against_str(): def test_media_type_matching(): - assert headers.MediaType("foo", "bar").match( - headers.MediaType("foo", "bar") - ) + assert headers.MediaType("foo", "bar").match(headers.MediaType("foo", "bar")) assert headers.MediaType("foo", "bar").match("foo/bar") @@ -365,31 +363,23 @@ def test_accept_ordering(raw): def test_not_accept_wildcard(): accept = headers.parse_accept("*/*, foo/*, */bar, foo/bar;q=0.1") - assert not accept.match( - "text/html", "foo/foo", "bar/bar", accept_wildcards=False - ) + assert not accept.match("text/html", "foo/foo", "bar/bar", accept_wildcards=False) # Should ignore wildcards in accept but still matches them from mimes m = accept.match("text/plain", "*/*", accept_wildcards=False) assert m.mime == "*/*" assert m.match("*/*") assert m.header == "foo/bar" - assert not accept.match( - "text/html", "foo/foo", "bar/bar", accept_wildcards=False - ) + assert not accept.match("text/html", "foo/foo", "bar/bar", accept_wildcards=False) def test_accept_misc(): - header = ( - "foo/bar;q=0.0, */plain;param=123, text/plain, text/*, foo/bar;q=0.5" - ) + header = "foo/bar;q=0.0, */plain;param=123, text/plain, text/*, foo/bar;q=0.5" a = headers.parse_accept(header) assert repr(a) == ( - "[*/plain;param=123, text/plain, text/*, " - "foo/bar;q=0.5, foo/bar;q=0.0]" + "[*/plain;param=123, text/plain, text/*, " "foo/bar;q=0.5, foo/bar;q=0.0]" ) # noqa: E501 assert str(a) == ( - "*/plain;param=123, text/plain, text/*, " - "foo/bar;q=0.5, foo/bar;q=0.0" + "*/plain;param=123, text/plain, text/*, " "foo/bar;q=0.5, foo/bar;q=0.0" ) # noqa: E501 # q=1 types don't match foo/bar but match the two others, # text/* comes first and matches */plain because it diff --git a/tests/test_json_encoding.py b/tests/test_json_encoding.py index 1dedbf72..1d652205 100644 --- a/tests/test_json_encoding.py +++ b/tests/test_json_encoding.py @@ -11,9 +11,7 @@ try: import ujson from ujson import dumps as udumps - ujson_version = tuple( - map(int, ujson.__version__.strip(ascii_lowercase).split(".")) - ) + ujson_version = tuple(map(int, ujson.__version__.strip(ascii_lowercase).split("."))) NO_UJSON = False DEFAULT_DUMPS = udumps @@ -69,15 +67,11 @@ def test_json_response_ujson(payload: Dict[str, Foo]): response = json(payload) assert response.body == b'{"foo":{"bar":"bar"}}' - with pytest.raises( - TypeError, match="Object of type Foo is not JSON serializable" - ): + with pytest.raises(TypeError, match="Object of type Foo is not JSON serializable"): json(payload, dumps=sdumps) Sanic("Test", dumps=sdumps) - with pytest.raises( - TypeError, match="Object of type Foo is not JSON serializable" - ): + with pytest.raises(TypeError, match="Object of type Foo is not JSON serializable"): json(payload) diff --git a/tests/test_keep_alive_timeout.py b/tests/test_keep_alive_timeout.py index cfa9f009..7505294e 100644 --- a/tests/test_keep_alive_timeout.py +++ b/tests/test_keep_alive_timeout.py @@ -72,9 +72,7 @@ def test_keep_alive_timeout_reuse(): port = get_port() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - client = ReusableClient( - keep_alive_timeout_app_reuse, loop=loop, port=port - ) + client = ReusableClient(keep_alive_timeout_app_reuse, loop=loop, port=port) try: with client: headers = {"Connection": "keep-alive"} @@ -113,14 +111,10 @@ def test_keep_alive_client_timeout(): port = get_port() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - client = ReusableClient( - keep_alive_app_client_timeout, loop=loop, port=port - ) + client = ReusableClient(keep_alive_app_client_timeout, loop=loop, port=port) with client: headers = {"Connection": "keep-alive"} - request, response = client.get( - "/1", headers=headers, timeout=1 - ) + request, response = client.get("/1", headers=headers, timeout=1) assert response.status == 200 assert response.text == "OK" @@ -153,14 +147,10 @@ def test_keep_alive_server_timeout(): port = get_port() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - client = ReusableClient( - keep_alive_app_server_timeout, loop=loop, port=port - ) + client = ReusableClient(keep_alive_app_server_timeout, loop=loop, port=port) with client: headers = {"Connection": "keep-alive"} - request, response = client.get( - "/1", headers=headers, timeout=60 - ) + request, response = client.get("/1", headers=headers, timeout=60) assert response.status == 200 assert response.text == "OK" @@ -190,9 +180,7 @@ def test_keep_alive_connection_context(): port = get_port() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - client = ReusableClient( - keep_alive_app_context, loop=loop, port=port - ) + client = ReusableClient(keep_alive_app_context, loop=loop, port=port) with client: headers = {"Connection": "keep-alive"} request1, _ = client.post("/ctx", headers=headers) @@ -203,9 +191,7 @@ def test_keep_alive_connection_context(): assert response.text == "hello" assert id(request1.conn_info.ctx) == id(request2.conn_info.ctx) assert ( - request1.conn_info.ctx.foo - == request2.conn_info.ctx.foo - == "hello" + request1.conn_info.ctx.foo == request2.conn_info.ctx.foo == "hello" ) assert request2.protocol.state["requests_count"] == 2 except OSError: diff --git a/tests/test_logging.py b/tests/test_logging.py index e099c998..84502cad 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -25,9 +25,7 @@ def test_log(app): log_stream = StringIO() for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) - logging.basicConfig( - format=logging_format, level=logging.DEBUG, stream=log_stream - ) + logging.basicConfig(format=logging_format, level=logging.DEBUG, stream=log_stream) logging.getLogger("asyncio").setLevel(logging.WARNING) log = logging.getLogger() rand_string = str(uuid.uuid4()) @@ -47,26 +45,13 @@ def test_logging_defaults(): Sanic("test_logging") for fmt in [h.formatter for h in logging.getLogger("sanic.root").handlers]: - assert ( - fmt._fmt - == LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"] - ) + assert fmt._fmt == LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"] - for fmt in [ - h.formatter for h in logging.getLogger("sanic.error").handlers - ]: - assert ( - fmt._fmt - == LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"] - ) + for fmt in [h.formatter for h in logging.getLogger("sanic.error").handlers]: + assert fmt._fmt == LOGGING_CONFIG_DEFAULTS["formatters"]["generic"]["format"] - for fmt in [ - h.formatter for h in logging.getLogger("sanic.access").handlers - ]: - assert ( - fmt._fmt - == LOGGING_CONFIG_DEFAULTS["formatters"]["access"]["format"] - ) + for fmt in [h.formatter for h in logging.getLogger("sanic.access").handlers]: + assert fmt._fmt == LOGGING_CONFIG_DEFAULTS["formatters"]["access"]["format"] def test_logging_pass_customer_logconfig(): @@ -85,14 +70,10 @@ def test_logging_pass_customer_logconfig(): for fmt in [h.formatter for h in logging.getLogger("sanic.root").handlers]: assert fmt._fmt == modified_config["formatters"]["generic"]["format"] - for fmt in [ - h.formatter for h in logging.getLogger("sanic.error").handlers - ]: + for fmt in [h.formatter for h in logging.getLogger("sanic.error").handlers]: assert fmt._fmt == modified_config["formatters"]["generic"]["format"] - for fmt in [ - h.formatter for h in logging.getLogger("sanic.access").handlers - ]: + for fmt in [h.formatter for h in logging.getLogger("sanic.access").handlers]: assert fmt._fmt == modified_config["formatters"]["access"]["format"] @@ -108,9 +89,7 @@ def test_log_connection_lost(app, debug, monkeypatch): stream = StringIO() error = logging.getLogger("sanic.error") error.addHandler(logging.StreamHandler(stream)) - monkeypatch.setattr( - sanic.server.protocols.http_protocol, "error_logger", error - ) + monkeypatch.setattr(sanic.server.protocols.http_protocol, "error_logger", error) @app.route("/conn_lost") async def conn_lost(request): @@ -234,9 +213,7 @@ def test_verbosity(app, caplog, app_verbosity, log_verbosity, exists): return text("hello") with caplog.at_level(logging.INFO): - _ = app.test_client.get( - "/", server_kwargs={"verbosity": app_verbosity} - ) + _ = app.test_client.get("/", server_kwargs={"verbosity": app_verbosity}) record = ("sanic.root", logging.INFO, rand_string) diff --git a/tests/test_motd.py b/tests/test_motd.py index 9b5c1af1..f9d76326 100644 --- a/tests/test_motd.py +++ b/tests/test_motd.py @@ -74,9 +74,7 @@ def test_reload_dirs(app): app.config.AUTO_RELOAD = True with patch.object(MOTD, "output") as mock: - app.prepare( - reload_dir="./", auto_reload=True, motd_display={"foo": "bar"} - ) + app.prepare(reload_dir="./", auto_reload=True, motd_display={"foo": "bar"}) mock.assert_called() assert mock.call_args.args[2]["auto-reload"] == f"enabled, {os.getcwd()}" assert mock.call_args.args[3] == {"foo": "bar"} diff --git a/tests/test_multiprocessing.py b/tests/test_multiprocessing.py index 64cfea0b..d7e3bd0b 100644 --- a/tests/test_multiprocessing.py +++ b/tests/test_multiprocessing.py @@ -162,11 +162,5 @@ def test_main_process_event(app, caplog): with caplog.at_level(logging.INFO): app.run(HOST, PORT, workers=num_workers) - assert ( - caplog.record_tuples.count(("sanic.root", 20, "main_process_start")) - == 2 - ) - assert ( - caplog.record_tuples.count(("sanic.root", 20, "main_process_stop")) - == 2 - ) + assert caplog.record_tuples.count(("sanic.root", 20, "main_process_start")) == 2 + assert caplog.record_tuples.count(("sanic.root", 20, "main_process_stop")) == 2 diff --git a/tests/test_named_routes.py b/tests/test_named_routes.py index 30302521..ac48cc8f 100644 --- a/tests/test_named_routes.py +++ b/tests/test_named_routes.py @@ -283,9 +283,7 @@ def test_dynamic_named_route_path(): def test_dynamic_named_route_unhashable(): app = Sanic("app") - @app.route( - "/folder//end/", name="route_unhashable" - ) + @app.route("/folder//end/", name="route_unhashable") async def handler(request, unhashable): return text("OK") @@ -366,10 +364,7 @@ def test_dynamic_add_named_route(): return text("OK") app.add_route(handler, "/folder/", name="route_dynamic") - assert ( - app.router.routes_all[("folder", "")].name - == "app.route_dynamic" - ) + assert app.router.routes_all[("folder", "")].name == "app.route_dynamic" assert app.url_for("route_dynamic", name="test") == "/folder/test" with pytest.raises(URLBuildError): app.url_for("handler") diff --git a/tests/test_pipelining.py b/tests/test_pipelining.py index 49d113c9..d3a4f7a5 100644 --- a/tests/test_pipelining.py +++ b/tests/test_pipelining.py @@ -95,6 +95,4 @@ def test_bad_headers(app): assert response1.status == 200 assert response2.status == 413 - assert ( - response1.headers["x-request-id"] != response2.headers["x-request-id"] - ) + assert response1.headers["x-request-id"] != response2.headers["x-request-id"] diff --git a/tests/test_reloader.py b/tests/test_reloader.py index 3e880316..1e5726a4 100644 --- a/tests/test_reloader.py +++ b/tests/test_reloader.py @@ -220,9 +220,7 @@ def test_reload_listeners(): filename, port=42305, auto_reload=True ) - proc = Popen( - argv["script"], cwd=tmpdir, stdout=PIPE, creationflags=flags - ) + proc = Popen(argv["script"], cwd=tmpdir, stdout=PIPE, creationflags=flags) try: timeout = Timer(TIMER_DELAY, terminate, [proc]) timeout.start() diff --git a/tests/test_request.py b/tests/test_request.py index 6f59317d..5158ed23 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -75,9 +75,7 @@ def test_request_id(request_id, expected_type): async def get(request): return response.empty() - request, _ = app.test_client.get( - "/", headers={"X-REQUEST-ID": f"{request_id}"} - ) + request, _ = app.test_client.get("/", headers={"X-REQUEST-ID": f"{request_id}"}) assert request.id == request_id assert type(request.id) == expected_type @@ -168,9 +166,7 @@ def test_request_accept(): assert match.header.mime == "text/plain" assert match.header.params == {"format": "flowed"} - header_value = ( - "text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c" - ) + header_value = "text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c" request, _ = app.test_client.get( "/", headers={"Accept": header_value}, diff --git a/tests/test_request_stream.py b/tests/test_request_stream.py index 5d5b8226..0d7bd1d8 100644 --- a/tests/test_request_stream.py +++ b/tests/test_request_stream.py @@ -369,9 +369,7 @@ def test_request_stream_blueprint(app): result += body.decode("utf-8") return text(result) - bp.add_route( - post_add_route, "/post/add_route", methods=["POST"], stream=True - ) + bp.add_route(post_add_route, "/post/add_route", methods=["POST"], stream=True) app.blueprint(bp) request, response = app.test_client.get("/get") diff --git a/tests/test_requests.py b/tests/test_requests.py index 5f4567f9..ea6c998a 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -68,9 +68,7 @@ async def test_url_asgi(app): request, response = await app.asgi_client.get("/") - if response.body.decode().endswith("/") and not ASGI_BASE_URL.endswith( - "/" - ): + if response.body.decode().endswith("/") and not ASGI_BASE_URL.endswith("/"): response.body[:-1] == ASGI_BASE_URL.encode() else: assert response.body == ASGI_BASE_URL.encode() @@ -387,9 +385,7 @@ def test_token(app, auth_type, token): if token: headers = { "content-type": "application/json", - "Authorization": f"{auth_type} {token}" - if auth_type - else f"{token}", + "Authorization": f"{auth_type} {token}" if auth_type else f"{token}", } else: headers = {"content-type": "application/json"} @@ -426,9 +422,7 @@ def test_credentials(app, capfd, auth_type, token, username, password): if token: headers = { "content-type": "application/json", - "Authorization": f"{auth_type} {token}" - if auth_type - else f"{token}", + "Authorization": f"{auth_type} {token}" if auth_type else f"{token}", } else: headers = {"content-type": "application/json"} @@ -649,9 +643,7 @@ async def test_standard_forwarded_asgi(app): assert response.json == {"for": "127.0.0.2", "proto": "ws"} # Header present but not matching anything - request, response = await app.asgi_client.get( - "/", headers={"Forwarded": "."} - ) + request, response = await app.asgi_client.get("/", headers={"Forwarded": "."}) assert response.json == {} # Forwarded header present but no matching secret -> use X-headers @@ -753,9 +745,7 @@ def test_remote_addr_with_two_proxies(app): assert request.remote_addr == "127.0.0.1" assert response.body == b"127.0.0.1" - headers = { - "X-Forwarded-For": ", 127.0.2.2, , ,127.0.0.1, , ,,127.0.1.2" - } + headers = {"X-Forwarded-For": ", 127.0.2.2, , ,127.0.0.1, , ,,127.0.1.2"} request, response = app.test_client.get("/", headers=headers) assert request.remote_addr == "127.0.0.1" assert response.body == b"127.0.0.1" @@ -794,9 +784,7 @@ async def test_remote_addr_with_two_proxies_asgi(app): assert request.remote_addr == "127.0.0.1" assert response.body == b"127.0.0.1" - headers = { - "X-Forwarded-For": ", 127.0.2.2, , ,127.0.0.1, , ,,127.0.1.2" - } + headers = {"X-Forwarded-For": ", 127.0.2.2, , ,127.0.0.1, , ,,127.0.1.2"} request, response = await app.asgi_client.get("/", headers=headers) assert request.remote_addr == "127.0.0.1" assert response.body == b"127.0.0.1" @@ -992,9 +980,7 @@ def test_post_form_urlencoded(app): payload = "test=OK" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = app.test_client.post( - "/", data=payload, headers=headers - ) + request, response = app.test_client.post("/", data=payload, headers=headers) assert request.form.get("test") == "OK" assert request.form.get("test") == "OK" # For request.parsed_form @@ -1009,9 +995,7 @@ async def test_post_form_urlencoded_asgi(app): payload = "test=OK" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) assert request.form.get("test") == "OK" assert request.form.get("test") == "OK" # For request.parsed_form @@ -1026,9 +1010,7 @@ def test_post_form_urlencoded_keep_blanks(app): payload = "test=" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = app.test_client.post( - "/", data=payload, headers=headers - ) + request, response = app.test_client.post("/", data=payload, headers=headers) assert request.form.get("test") == "" assert request.form.get("test") == "" # For request.parsed_form @@ -1044,9 +1026,7 @@ async def test_post_form_urlencoded_keep_blanks_asgi(app): payload = "test=" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) assert request.form.get("test") == "" assert request.form.get("test") == "" # For request.parsed_form @@ -1060,9 +1040,7 @@ def test_post_form_urlencoded_drop_blanks(app): payload = "test=" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = app.test_client.post( - "/", data=payload, headers=headers - ) + request, response = app.test_client.post("/", data=payload, headers=headers) assert "test" not in request.form.keys() @@ -1076,9 +1054,7 @@ async def test_post_form_urlencoded_drop_blanks_asgi(app): payload = "test=" headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) assert "test" not in request.form.keys() @@ -1133,9 +1109,7 @@ async def test_post_form_multipart_form_data_asgi(app, payload): headers = {"content-type": "multipart/form-data; boundary=----sanic"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) assert request.form.get("test") == "OK" @@ -1200,9 +1174,7 @@ def test_form_with_multiple_values(app): headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = app.test_client.post( - "/", data=payload, headers=headers - ) + request, response = app.test_client.post("/", data=payload, headers=headers) assert request.form.getlist("selectedItems") == ["v1", "v2", "v3"] @@ -1217,9 +1189,7 @@ async def test_form_with_multiple_values_asgi(app): headers = {"content-type": "application/x-www-form-urlencoded"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) assert request.form.getlist("selectedItems") == ["v1", "v2", "v3"] @@ -1445,9 +1415,7 @@ def test_request_multipart_file_without_field_name(app, caplog): headers = {"content-type": "multipart/form-data; boundary=------sanic"} - request, _ = app.test_client.post( - data=payload, headers=headers, debug=True - ) + request, _ = app.test_client.post(data=payload, headers=headers, debug=True) with caplog.at_level(logging.DEBUG): request.form @@ -1484,9 +1452,7 @@ def test_request_multipart_file_duplicate_filed_name(app): "Content-Type": "multipart/form-data; boundary=e73ffaa8b1b2472b8ec848de833cb05b" } - request, _ = app.test_client.post( - data=payload, headers=headers, debug=True - ) + request, _ = app.test_client.post(data=payload, headers=headers, debug=True) assert request.form.getlist("file") == [ '{"test":"json"}', '{"test":"json2"}', @@ -1607,9 +1573,7 @@ def test_request_parsing_form_failed(app, caplog): payload = "test=OK" headers = {"content-type": "multipart/form-data"} - request, response = app.test_client.post( - "/", data=payload, headers=headers - ) + request, response = app.test_client.post("/", data=payload, headers=headers) with caplog.at_level(logging.ERROR): request.form @@ -1630,9 +1594,7 @@ async def test_request_parsing_form_failed_asgi(app, caplog): payload = "test=OK" headers = {"content-type": "multipart/form-data"} - request, response = await app.asgi_client.post( - "/", data=payload, headers=headers - ) + request, response = await app.asgi_client.post("/", data=payload, headers=headers) with caplog.at_level(logging.ERROR): request.form @@ -1743,9 +1705,7 @@ def test_request_query_args_custom_parsing(app): def handler(request): return text("pass") - request, response = app.test_client.get( - "/?test1=value1&test2=&test3=value3" - ) + request, response = app.test_client.get("/?test1=value1&test2=&test3=value3") assert request.get_query_args(keep_blank_values=True) == [ ("test1", "value1"), @@ -1762,9 +1722,7 @@ def test_request_query_args_custom_parsing(app): {"test1": ["value1"], "test2": [""], "test3": ["value3"]} ) - assert request.args == RequestParameters( - {"test1": ["value1"], "test3": ["value3"]} - ) + assert request.args == RequestParameters({"test1": ["value1"], "test3": ["value3"]}) assert request.get_args(keep_blank_values=False) == RequestParameters( {"test1": ["value1"], "test3": ["value3"]} @@ -1777,9 +1735,7 @@ async def test_request_query_args_custom_parsing_asgi(app): def handler(request): return text("pass") - request, response = await app.asgi_client.get( - "/?test1=value1&test2=&test3=value3" - ) + request, response = await app.asgi_client.get("/?test1=value1&test2=&test3=value3") assert request.get_query_args(keep_blank_values=True) == [ ("test1", "value1"), @@ -1796,9 +1752,7 @@ async def test_request_query_args_custom_parsing_asgi(app): {"test1": ["value1"], "test2": [""], "test3": ["value3"]} ) - assert request.args == RequestParameters( - {"test1": ["value1"], "test3": ["value3"]} - ) + assert request.args == RequestParameters({"test1": ["value1"], "test3": ["value3"]}) assert request.get_args(keep_blank_values=False) == RequestParameters( {"test1": ["value1"], "test3": ["value3"]} @@ -1907,9 +1861,7 @@ def test_request_server_name_in_host_header(app): def handler(request): return text("OK") - request, response = app.test_client.get( - "/", headers={"Host": "my-server:5555"} - ) + request, response = app.test_client.get("/", headers={"Host": "my-server:5555"}) assert request.server_name == "my-server" request, response = app.test_client.get( @@ -1917,9 +1869,7 @@ def test_request_server_name_in_host_header(app): ) assert request.server_name == "[2a00:1450:400f:80c::200e]" - request, response = app.test_client.get( - "/", headers={"Host": "mal_formed"} - ) + request, response = app.test_client.get("/", headers={"Host": "mal_formed"}) assert request.server_name == "" @@ -1955,9 +1905,7 @@ def test_request_server_port_in_host_header(app): def handler(request): return text("OK") - request, response = app.test_client.get( - "/", headers={"Host": "my-server:5555"} - ) + request, response = app.test_client.get("/", headers={"Host": "my-server:5555"}) assert request.server_port == 5555 request, response = app.test_client.get( @@ -1965,9 +1913,7 @@ def test_request_server_port_in_host_header(app): ) assert request.server_port == 5555 - request, response = app.test_client.get( - "/", headers={"Host": "mal_formed:5555"} - ) + request, response = app.test_client.get("/", headers={"Host": "mal_formed:5555"}) if PORT is None: assert request.server_port != 5555 else: @@ -2038,13 +1984,8 @@ def test_url_for_with_forwarded_request(app): }, ) assert app.url_for("view_name") == "/another_view" - assert ( - app.url_for("view_name", _external=True) - == "http://my-server/another_view" - ) - assert ( - request.url_for("view_name") == "https://my-server:6789/another_view" - ) + assert app.url_for("view_name", _external=True) == "http://my-server/another_view" + assert request.url_for("view_name") == "https://my-server:6789/another_view" request, response = app.test_client.get( "/", @@ -2159,10 +2100,7 @@ def test_url_for_without_server_name(app): return text("url-for") request, response = app.test_client.get("/sample") - assert ( - response.json["url"] - == f"http://127.0.0.1:{request.server_port}/url-for" - ) + assert response.json["url"] == f"http://127.0.0.1:{request.server_port}/url-for" def test_safe_method_with_body_ignored(app): @@ -2219,15 +2157,11 @@ def test_conflicting_body_methods_overload(app: Sanic): @app.put("/p/", name="two") @app.put("/p/", name="three") async def put(request, foo=None): - return json( - {"name": request.route.name, "body": str(request.body), "foo": foo} - ) + return json({"name": request.route.name, "body": str(request.body), "foo": foo}) @app.delete("/p/") async def delete(request, foo): - return json( - {"name": request.route.name, "body": str(request.body), "foo": foo} - ) + return json({"name": request.route.name, "body": str(request.body), "foo": foo}) payload = {"test": "OK"} data = str(json_dumps(payload).encode()) @@ -2285,9 +2219,7 @@ def test_handler_overload(app: Sanic): def handler(request, **kwargs): return json(kwargs) - _, response = app.test_client.get( - "/long/sub/route/param_a/foo/param_b/bar" - ) + _, response = app.test_client.get("/long/sub/route/param_a/foo/param_b/bar") assert response.status == 200 assert response.json == { "param_a": "foo", diff --git a/tests/test_response.py b/tests/test_response.py index 08cb899b..806e622f 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -127,14 +127,10 @@ def test_response_content_length(app): ) _, response = app.test_client.get("/response_with_space") - content_length_for_response_with_space = response.headers.get( - "Content-Length" - ) + content_length_for_response_with_space = response.headers.get("Content-Length") _, response = app.test_client.get("/response_without_space") - content_length_for_response_without_space = response.headers.get( - "Content-Length" - ) + content_length_for_response_without_space = response.headers.get("Content-Length") assert ( content_length_for_response_with_space @@ -289,9 +285,7 @@ def test_stream_response_with_cookies(app): cookies = CookieJar(headers) cookies["test"] = "modified" cookies["test"] = "pass" - response = await request.respond( - content_type="text/csv", headers=headers - ) + response = await request.respond(content_type="text/csv", headers=headers) await response.send("foo,") await asyncio.sleep(0.001) @@ -340,9 +334,7 @@ def get_file_last_modified_timestamp( return (static_file_directory / file_name).stat().st_mtime -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) @pytest.mark.parametrize("status", [200, 401]) def test_file_response(app: Sanic, file_name, static_file_directory, status): @app.route("/files/", methods=["GET"]) @@ -369,9 +361,7 @@ def test_file_response(app: Sanic, file_name, static_file_directory, status): ("python.png", "logo.png"), ], ) -def test_file_response_custom_filename( - app: Sanic, source, dest, static_file_directory -): +def test_file_response_custom_filename(app: Sanic, source, dest, static_file_directory): @app.route("/files/", methods=["GET"]) def file_route(request, filename): file_path = os.path.join(static_file_directory, filename) @@ -381,10 +371,7 @@ def test_file_response_custom_filename( request, response = app.test_client.get(f"/files/{source}") assert response.status == 200 assert response.body == get_file_content(static_file_directory, source) - assert ( - response.headers["Content-Disposition"] - == f'attachment; filename="{dest}"' - ) + assert response.headers["Content-Disposition"] == f'attachment; filename="{dest}"' @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) @@ -418,9 +405,7 @@ def test_file_head_response(app: Sanic, file_name, static_file_directory): ) -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_file_stream_response(app: Sanic, file_name, static_file_directory): @app.route("/files/", methods=["GET"]) def file_route(request, filename): @@ -458,16 +443,11 @@ def test_file_stream_response_custom_filename( request, response = app.test_client.get(f"/files/{source}") assert response.status == 200 assert response.body == get_file_content(static_file_directory, source) - assert ( - response.headers["Content-Disposition"] - == f'attachment; filename="{dest}"' - ) + assert response.headers["Content-Disposition"] == f'attachment; filename="{dest}"' @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) -def test_file_stream_head_response( - app: Sanic, file_name, static_file_directory -): +def test_file_stream_head_response(app: Sanic, file_name, static_file_directory): @app.route("/files/", methods=["GET", "HEAD"]) async def file_route(request, filename): file_path = os.path.join(static_file_directory, filename) @@ -504,12 +484,8 @@ def test_file_stream_head_response( ) -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) -@pytest.mark.parametrize( - "size,start,end", [(1024, 0, 1024), (4096, 1024, 8192)] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) +@pytest.mark.parametrize("size,start,end", [(1024, 0, 1024), (4096, 1024, 8192)]) def test_file_stream_response_range( app: Sanic, file_name, static_file_directory, size, start, end ): @@ -700,8 +676,7 @@ def send_response_after_eof_should_fail( ) error_msg2 = ( - "Response stream was ended, no more " - "response data is allowed to be sent." + "Response stream was ended, no more " "response data is allowed to be sent." ) with caplog.at_level(ERROR): @@ -711,48 +686,30 @@ def send_response_after_eof_should_fail( assert message_in_records(caplog.records, error_msg2) -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) -def test_file_response_headers( - app: Sanic, file_name: str, static_file_directory: str -): +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) +def test_file_response_headers(app: Sanic, file_name: str, static_file_directory: str): test_last_modified = datetime.now() test_max_age = 10 test_expires = test_last_modified.timestamp() + test_max_age @app.route("/files/cached/", methods=["GET"]) def file_route_cache(request: Request, filename: str): - file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() - return file( - file_path, max_age=test_max_age, last_modified=test_last_modified - ) + file_path = (Path(static_file_directory) / unquote(filename)).absolute() + return file(file_path, max_age=test_max_age, last_modified=test_last_modified) - @app.route( - "/files/cached_default_last_modified/", methods=["GET"] - ) - def file_route_cache_default_last_modified( - request: Request, filename: str - ): - file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() + @app.route("/files/cached_default_last_modified/", methods=["GET"]) + def file_route_cache_default_last_modified(request: Request, filename: str): + file_path = (Path(static_file_directory) / unquote(filename)).absolute() return file(file_path, max_age=test_max_age) @app.route("/files/no_cache/", methods=["GET"]) def file_route_no_cache(request: Request, filename: str): - file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() + file_path = (Path(static_file_directory) / unquote(filename)).absolute() return file(file_path) @app.route("/files/no_store/", methods=["GET"]) def file_route_no_store(request: Request, filename: str): - file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() + file_path = (Path(static_file_directory) / unquote(filename)).absolute() return file(file_path, no_store=True) _, response = app.test_client.get(f"/files/cached/{file_name}") @@ -765,8 +722,7 @@ def test_file_response_headers( ) assert ( "expires" in headers - and headers.get("expires")[:-6] - == formatdate(test_expires, usegmt=True)[:-6] + and headers.get("expires")[:-6] == formatdate(test_expires, usegmt=True)[:-6] # [:-6] to allow at most 1 min difference # It's minimal for cases like: # Thu, 26 May 2022 05:36:59 GMT @@ -774,9 +730,9 @@ def test_file_response_headers( # Thu, 26 May 2022 05:37:00 GMT ) assert response.status == 200 - assert "last-modified" in headers and headers.get( - "last-modified" - ) == formatdate(test_last_modified.timestamp(), usegmt=True) + assert "last-modified" in headers and headers.get("last-modified") == formatdate( + test_last_modified.timestamp(), usegmt=True + ) _, response = app.test_client.get( f"/files/cached_default_last_modified/{file_name}" @@ -785,23 +741,19 @@ def test_file_response_headers( static_file_directory, file_name ) headers = response.headers - assert "last-modified" in headers and headers.get( - "last-modified" - ) == formatdate(file_last_modified, usegmt=True) + assert "last-modified" in headers and headers.get("last-modified") == formatdate( + file_last_modified, usegmt=True + ) assert response.status == 200 _, response = app.test_client.get(f"/files/no_cache/{file_name}") headers = response.headers - assert "cache-control" in headers and "no-cache" == headers.get( - "cache-control" - ) + assert "cache-control" in headers and "no-cache" == headers.get("cache-control") assert response.status == 200 _, response = app.test_client.get(f"/files/no_store/{file_name}") headers = response.headers - assert "cache-control" in headers and "no-store" == headers.get( - "cache-control" - ) + assert "cache-control" in headers and "no-store" == headers.get("cache-control") assert response.status == 200 @@ -849,17 +801,13 @@ def test_file_validate(app: Sanic, static_file_directory: str): file_path.unlink() -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_file_validating_invalid_header( app: Sanic, file_name: str, static_file_directory: str ): @app.route("/files/", methods=["GET"]) def file_route(request: Request, filename: str): - handler_file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() + handler_file_path = (Path(static_file_directory) / unquote(filename)).absolute() return file( handler_file_path, @@ -884,17 +832,13 @@ def test_file_validating_invalid_header( assert response.body == get_file_content(static_file_directory, file_name) -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_file_validating_304_response( app: Sanic, file_name: str, static_file_directory: str ): @app.route("/files/", methods=["GET"]) def file_route(request: Request, filename: str): - handler_file_path = ( - Path(static_file_directory) / unquote(filename) - ).absolute() + handler_file_path = (Path(static_file_directory) / unquote(filename)).absolute() return file( handler_file_path, @@ -914,9 +858,7 @@ def test_file_validating_304_response( assert response.body == b"" -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_file_validating_304_response( app: Sanic, file_name: str, static_file_directory: str ): @@ -930,9 +872,7 @@ def test_file_validating_304_response( _, response = app.test_client.get( "/static", headers={ - "if-modified-since": formatdate( - last_modified.timestamp(), usegmt=True - ) + "if-modified-since": formatdate(last_modified.timestamp(), usegmt=True) }, ) assert response.status == 304 diff --git a/tests/test_routes.py b/tests/test_routes.py index e1ffe3cf..3877c200 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -163,9 +163,7 @@ def test_matching(path, headers, expected): request = Request(path, headers, None, "GET", None, app) try: - app.router.get( - request.path, request.method, request.headers.get("host") - ) + app.router.get(request.path, request.method, request.headers.get("host")) except NotFound: response = 404 except Exception: @@ -686,9 +684,7 @@ def test_websocket_route_with_subprotocols(app, subprotocols, expected): results = ws.subprotocol assert ws.subprotocol is not None - _, response = SanicTestClient(app).websocket( - "/ws", subprotocols=subprotocols - ) + _, response = SanicTestClient(app).websocket("/ws", subprotocols=subprotocols) assert response.opened is True assert results == expected @@ -1287,8 +1283,6 @@ async def test_duplicate_route_error(app): async def handler_bar(request): return text("...") - message = ( - "Duplicate route names detected: test_duplicate_route_error.duped." - ) + message = "Duplicate route names detected: test_duplicate_route_error.duped." with pytest.raises(ServerError, match=message): await app._startup() diff --git a/tests/test_server_events.py b/tests/test_server_events.py index e88ea018..754ac352 100644 --- a/tests/test_server_events.py +++ b/tests/test_server_events.py @@ -108,9 +108,7 @@ async def test_trigger_before_events_create_server(app): async def init_db(app, loop): app.ctx.db = MySanicDb() - srv = await app.create_server( - debug=True, return_asyncio_server=True, port=PORT - ) + srv = await app.create_server(debug=True, return_asyncio_server=True, port=PORT) await srv.startup() await srv.before_start() @@ -167,9 +165,7 @@ def test_create_server_trigger_events(app): with closing(socket()) as sock: sock.bind(("127.0.0.1", 0)) - serv_coro = app.create_server( - return_asyncio_server=True, sock=sock, debug=True - ) + serv_coro = app.create_server(return_asyncio_server=True, sock=sock, debug=True) serv_task = asyncio.ensure_future(serv_coro, loop=loop) server = loop.run_until_complete(serv_task) loop.run_until_complete(server.startup()) @@ -199,9 +195,7 @@ async def test_missing_startup_raises_exception(app): async def init_db(app, loop): ... - srv = await app.create_server( - debug=True, return_asyncio_server=True, port=PORT - ) + srv = await app.create_server(debug=True, return_asyncio_server=True, port=PORT) with pytest.raises(SanicException): await srv.before_start() diff --git a/tests/test_server_loop.py b/tests/test_server_loop.py index 2026ae0d..ebfe190c 100644 --- a/tests/test_server_loop.py +++ b/tests/test_server_loop.py @@ -93,9 +93,7 @@ def test_sets_loop_policy_only_when_not_already_set(monkeypatch): # Existing policy is not uvloop.EventLoopPolicy get_event_loop_policy = Mock(return_value=None) - monkeypatch.setattr( - loop.asyncio, "get_event_loop_policy", get_event_loop_policy - ) + monkeypatch.setattr(loop.asyncio, "get_event_loop_policy", get_event_loop_policy) with patch("asyncio.set_event_loop_policy") as set_event_loop_policy: loop.try_use_uvloop() @@ -106,9 +104,7 @@ def test_sets_loop_policy_only_when_not_already_set(monkeypatch): # Existing policy is uvloop.EventLoopPolicy get_event_loop_policy = Mock(return_value=policy) - monkeypatch.setattr( - loop.asyncio, "get_event_loop_policy", get_event_loop_policy - ) + monkeypatch.setattr(loop.asyncio, "get_event_loop_policy", get_event_loop_policy) with patch("asyncio.set_event_loop_policy") as set_event_loop_policy: loop.try_use_uvloop() diff --git a/tests/test_signals.py b/tests/test_signals.py index 3fa97923..fca40d5c 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -26,9 +26,7 @@ def test_add_signal_method_handler(app): class TestSanic(Sanic): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.add_signal( - self.after_routing_signal_handler, "http.routing.after" - ) + self.add_signal(self.after_routing_signal_handler, "http.routing.after") def after_routing_signal_handler(self, *args, **kwargs): nonlocal counter @@ -443,9 +441,7 @@ async def test_report_exception(app: Sanic): registered_signal_handlers = [ handler - for handler, *_ in app.signal_router.get( - Event.SERVER_EXCEPTION_REPORT.value - ) + for handler, *_ in app.signal_router.get(Event.SERVER_EXCEPTION_REPORT.value) ] assert catch_any_exception in registered_signal_handlers diff --git a/tests/test_static.py b/tests/test_static.py index 458feb32..4587b4cc 100644 --- a/tests/test_static.py +++ b/tests/test_static.py @@ -79,9 +79,7 @@ def hard_link(static_file_directory): ["test.file", "decode me.txt", "python.png", "symlink", "hard_link"], ) def test_static_file(app, static_file_directory, file_name): - app.static( - "/testing.file", get_file_path(static_file_directory, file_name) - ) + app.static("/testing.file", get_file_path(static_file_directory, file_name)) request, response = app.test_client.get("/testing.file") assert response.status == 200 @@ -239,9 +237,7 @@ def test_static_content_range_correct(app, file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12:20 - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:20] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -259,9 +255,7 @@ def test_static_content_range_front(app, file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -279,9 +273,7 @@ def test_static_content_range_back(app, file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - -12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[-12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -305,9 +297,7 @@ def test_static_content_range_empty( assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) - assert response.body == bytes( - get_file_content(static_file_directory, file_name) - ) + assert response.body == bytes(get_file_content(static_file_directory, file_name)) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) @@ -329,9 +319,7 @@ def test_static_content_range_error(app, file_name, static_file_directory): @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) -def test_static_content_range_invalid_unit( - app, file_name, static_file_directory -): +def test_static_content_range_invalid_unit(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), @@ -347,9 +335,7 @@ def test_static_content_range_invalid_unit( @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) -def test_static_content_range_invalid_start( - app, file_name, static_file_directory -): +def test_static_content_range_invalid_start(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), @@ -365,9 +351,7 @@ def test_static_content_range_invalid_start( @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) -def test_static_content_range_invalid_end( - app, file_name, static_file_directory -): +def test_static_content_range_invalid_end(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), @@ -383,9 +367,7 @@ def test_static_content_range_invalid_end( @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) -def test_static_content_range_invalid_parameters( - app, file_name, static_file_directory -): +def test_static_content_range_invalid_parameters(app, file_name, static_file_directory): app.static( "/testing.file", get_file_path(static_file_directory, file_name), @@ -399,9 +381,7 @@ def test_static_content_range_invalid_parameters( assert "Invalid for Content Range parameters" in response.text -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_static_file_specified_host(app, static_file_directory, file_name): app.static( "/testing.file", @@ -441,14 +421,10 @@ def test_static_stream_large_file( assert response.body == get_file_content(static_file_directory, file_name) -@pytest.mark.parametrize( - "file_name", ["test.file", "decode me.txt", "python.png"] -) +@pytest.mark.parametrize("file_name", ["test.file", "decode me.txt", "python.png"]) def test_use_modified_since(app, static_file_directory, file_name): file_stat = os.stat(get_file_path(static_file_directory, file_name)) - modified_since = strftime( - "%a, %d %b %Y %H:%M:%S GMT", gmtime(file_stat.st_mtime) - ) + modified_since = strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime(file_stat.st_mtime)) app.static( "/testing.file", @@ -547,32 +523,22 @@ async def test_multiple_statics_error(app, static_file_directory): app.static("/file", get_file_path(static_file_directory, "test.file")) app.static("/png", get_file_path(static_file_directory, "python.png")) - message = ( - r"Duplicate route names detected: test_multiple_statics_error\.static" - ) + message = r"Duplicate route names detected: test_multiple_statics_error\.static" with pytest.raises(ServerError, match=message): await app._startup() def test_multiple_statics(app, static_file_directory): - app.static( - "/file", get_file_path(static_file_directory, "test.file"), name="file" - ) - app.static( - "/png", get_file_path(static_file_directory, "python.png"), name="png" - ) + app.static("/file", get_file_path(static_file_directory, "test.file"), name="file") + app.static("/png", get_file_path(static_file_directory, "python.png"), name="png") _, response = app.test_client.get("/file") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.file" - ) + assert response.body == get_file_content(static_file_directory, "test.file") _, response = app.test_client.get("/png") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "python.png" - ) + assert response.body == get_file_content(static_file_directory, "python.png") @pytest.mark.asyncio @@ -580,25 +546,23 @@ async def test_resource_type_default_error(app, static_file_directory): app.static("/static", static_file_directory) app.static("/file", get_file_path(static_file_directory, "test.file")) - message = r"Duplicate route names detected: test_resource_type_default_error\.static" + message = ( + r"Duplicate route names detected: test_resource_type_default_error\.static" + ) with pytest.raises(ServerError, match=message): await app._startup() def test_resource_type_default(app, static_file_directory): app.static("/static", static_file_directory, name="static") - app.static( - "/file", get_file_path(static_file_directory, "test.file"), name="file" - ) + app.static("/file", get_file_path(static_file_directory, "test.file"), name="file") _, response = app.test_client.get("/static") assert response.status == 404 _, response = app.test_client.get("/file") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.file" - ) + assert response.body == get_file_content(static_file_directory, "test.file") def test_resource_type_file(app, static_file_directory): @@ -610,9 +574,7 @@ def test_resource_type_file(app, static_file_directory): _, response = app.test_client.get("/file") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.file" - ) + assert response.body == get_file_content(static_file_directory, "test.file") with pytest.raises(TypeError): app.static("/static", static_file_directory, resource_type="file") @@ -623,9 +585,7 @@ def test_resource_type_dir(app, static_file_directory): _, response = app.test_client.get("/static/test.file") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.file" - ) + assert response.body == get_file_content(static_file_directory, "test.file") with pytest.raises(TypeError): app.static( @@ -666,12 +626,8 @@ def test_breakout(app: Sanic, static_file_directory: str): assert response.status == 404 -@pytest.mark.skipif( - sys.platform != "win32", reason="Block backslash on Windows only" -) -def test_double_backslash_prohibited_on_win32( - app: Sanic, static_file_directory: str -): +@pytest.mark.skipif(sys.platform != "win32", reason="Block backslash on Windows only") +def test_double_backslash_prohibited_on_win32(app: Sanic, static_file_directory: str): app.static("/foo", static_file_directory) _, response = app.test_client.get("/foo/static/..\\static/test.file") diff --git a/tests/test_static_directory.py b/tests/test_static_directory.py index 81592f45..08ccb492 100644 --- a/tests/test_static_directory.py +++ b/tests/test_static_directory.py @@ -31,9 +31,7 @@ def test_static_index_single(app: Sanic, static_file_directory: str): _, response = app.test_client.get("/static/") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.html" - ) + assert response.body == get_file_content(static_file_directory, "test.html") assert response.headers["Content-Type"] == "text/html" @@ -53,15 +51,11 @@ def test_static_index_multiple(app: Sanic, static_file_directory: str): _, response = app.test_client.get("/static/") assert response.status == 200 - assert response.body == get_file_content( - static_file_directory, "test.html" - ) + assert response.body == get_file_content(static_file_directory, "test.html") assert response.headers["Content-Type"] == "text/html" -def test_static_directory_view_and_index( - app: Sanic, static_file_directory: str -): +def test_static_directory_view_and_index(app: Sanic, static_file_directory: str): app.static( "/static", static_file_directory, diff --git a/tests/test_tls.py b/tests/test_tls.py index e8050e26..4b04c986 100644 --- a/tests/test_tls.py +++ b/tests/test_tls.py @@ -111,9 +111,7 @@ def replace_server_name(hostname): server_hostname=None, session=None, ): - return orig_wrap_bio( - self, incoming, outgoing, server_side, hostname, session - ) + return orig_wrap_bio(self, incoming, outgoing, server_side, hostname, session) orig_wrap_bio, ssl.SSLContext.wrap_bio = ( ssl.SSLContext.wrap_bio, @@ -462,9 +460,7 @@ def test_logger_vhosts(caplog): single_process=True, ) - logmsg = [ - m for s, l, m in caplog.record_tuples if m.startswith("Certificate") - ][0] + logmsg = [m for s, l, m in caplog.record_tuples if m.startswith("Certificate")][0] assert logmsg == ( "Certificate vhosts: localhost, 127.0.0.1, 0:0:0:0:0:0:0:1, " @@ -495,9 +491,7 @@ def test_mk_cert_creator_is_not_supported(app): cert_creator = MkcertCreator(app, _default, _default) with patch("subprocess.run") as run: run.side_effect = Exception("") - with pytest.raises( - SanicException, match="Sanic is attempting to use mkcert" - ): + with pytest.raises(SanicException, match="Sanic is attempting to use mkcert"): cert_creator.check_supported() @@ -535,9 +529,7 @@ def test_trustme_creator_is_supported(app, monkeypatch): def test_trustme_creator_is_not_supported(app, monkeypatch): monkeypatch.setattr(sanic.http.tls.creators, "TRUSTME_INSTALLED", False) cert_creator = TrustmeCreator(app, _default, _default) - with pytest.raises( - SanicException, match="Sanic is attempting to use trustme" - ): + with pytest.raises(SanicException, match="Sanic is attempting to use trustme"): cert_creator.check_supported() @@ -623,12 +615,8 @@ def test_get_ssl_context_only_mkcert( ): app.state.mode = Mode.DEBUG app.config.LOCAL_CERT_CREATOR = requirement - monkeypatch.setattr( - sanic.http.tls.creators, "MkcertCreator", MockMkcertCreator - ) - monkeypatch.setattr( - sanic.http.tls.creators, "TrustmeCreator", MockTrustmeCreator - ) + monkeypatch.setattr(sanic.http.tls.creators, "MkcertCreator", MockMkcertCreator) + monkeypatch.setattr(sanic.http.tls.creators, "TrustmeCreator", MockTrustmeCreator) MockMkcertCreator.SUPPORTED = mk_supported MockTrustmeCreator.SUPPORTED = trustme_supported diff --git a/tests/test_unix_socket.py b/tests/test_unix_socket.py index 1dd90a52..c56edb5a 100644 --- a/tests/test_unix_socket.py +++ b/tests/test_unix_socket.py @@ -23,9 +23,7 @@ from sanic.response import text pytestmark = pytest.mark.skipif(os.name != "posix", reason="UNIX only") SOCKPATH = "/tmp/sanictest.sock" SOCKPATH2 = "/tmp/sanictest2.sock" -httpx_version = tuple( - map(int, httpx.__version__.strip(ascii_lowercase).split(".")) -) +httpx_version = tuple(map(int, httpx.__version__.strip(ascii_lowercase).split("."))) @pytest.fixture(autouse=True) diff --git a/tests/test_url_building.py b/tests/test_url_building.py index 4e1c6ac9..e3a9c83a 100644 --- a/tests/test_url_building.py +++ b/tests/test_url_building.py @@ -35,9 +35,7 @@ URL_FOR_VALUE4 = f"http://{test_host}:{test_port}/myurl?arg1=v1#anchor" def _generate_handlers_from_names(app, l): for name in l: # this is the easiest way to generate functions with dynamic names - exec( - f'@app.route(name)\ndef {name}(request):\n\treturn text("{name}")' - ) + exec(f'@app.route(name)\ndef {name}(request):\n\treturn text("{name}")') @pytest.fixture diff --git a/tests/test_url_for.py b/tests/test_url_for.py index c27ca749..3c44fb5c 100644 --- a/tests/test_url_for.py +++ b/tests/test_url_for.py @@ -15,10 +15,7 @@ def test_routes_with_host(app): assert app.url_for("hostindex") == "/" assert app.url_for("hostpath") == "/path" assert app.url_for("hostindex", _external=True) == "http://example.com/" - assert ( - app.url_for("hostpath", _external=True) - == "http://path.example.com/path" - ) + assert app.url_for("hostpath", _external=True) == "http://path.example.com/path" def test_routes_with_multiple_hosts(app): @@ -27,9 +24,7 @@ def test_routes_with_multiple_hosts(app): pass assert app.url_for("hostindex") == "/" - assert ( - app.url_for("hostindex", _host="example.com") == "http://example.com/" - ) + assert app.url_for("hostindex", _host="example.com") == "http://example.com/" with pytest.raises(ValueError) as e: assert app.url_for("hostindex", _external=True) diff --git a/tests/test_url_for_static.py b/tests/test_url_for_static.py index bc63cb90..4adcfb77 100644 --- a/tests/test_url_for_static.py +++ b/tests/test_url_for_static.py @@ -36,9 +36,7 @@ def get_file_content(static_file_directory, file_name): ) def test_static_file(static_file_directory, file_name): app = Sanic("qq") - app.static( - "/testing.file", get_file_path(static_file_directory, file_name) - ) + app.static("/testing.file", get_file_path(static_file_directory, file_name)) app.static( "/testing2.file", get_file_path(static_file_directory, file_name), @@ -155,16 +153,10 @@ def test_static_directory(file_name, base_uri, static_file_directory): app.router.reset() app.blueprint(bp) - uri = app.url_for( - "static", name="test_bp_static.static", filename=file_name - ) - uri2 = app.url_for( - "static", name="test_bp_static.static", filename="/" + file_name - ) + uri = app.url_for("static", name="test_bp_static.static", filename=file_name) + uri2 = app.url_for("static", name="test_bp_static.static", filename="/" + file_name) - uri4 = app.url_for( - "static", name="test_bp_static.uploads", filename=file_name - ) + uri4 = app.url_for("static", name="test_bp_static.uploads", filename=file_name) uri5 = app.url_for( "static", name="test_bp_static.uploads", filename="/" + file_name ) @@ -213,9 +205,7 @@ def test_static_head_request(file_name, static_file_directory): # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") request, response = app.test_client.head(uri) assert response.status == 200 @@ -253,27 +243,21 @@ def test_static_content_range_correct(file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12:20 - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:20] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") assert uri == app.url_for("test_bp_static.static") request, response = app.test_client.get(uri, headers=headers) assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12:20 - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:20] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -305,18 +289,14 @@ def test_static_content_range_front(file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", filename="any") @@ -324,9 +304,7 @@ def test_static_content_range_front(file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - 12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -358,18 +336,14 @@ def test_static_content_range_back(file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - -12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[-12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", filename="any") @@ -377,9 +351,7 @@ def test_static_content_range_back(file_name, static_file_directory): assert response.status == 206 assert "Content-Length" in response.headers assert "Content-Range" in response.headers - static_content = bytes(get_file_content(static_file_directory, file_name))[ - -12: - ] + static_content = bytes(get_file_content(static_file_directory, file_name))[-12:] assert int(response.headers["Content-Length"]) == len(static_content) assert response.body == static_content @@ -413,16 +385,12 @@ def test_static_content_range_empty(file_name, static_file_directory): assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) - assert response.body == bytes( - get_file_content(static_file_directory, file_name) - ) + assert response.body == bytes(get_file_content(static_file_directory, file_name)) # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", filename="any") @@ -433,9 +401,7 @@ def test_static_content_range_empty(file_name, static_file_directory): assert int(response.headers["Content-Length"]) == len( get_file_content(static_file_directory, file_name) ) - assert response.body == bytes( - get_file_content(static_file_directory, file_name) - ) + assert response.body == bytes(get_file_content(static_file_directory, file_name)) @pytest.mark.parametrize("file_name", ["test.file", "decode me.txt"]) @@ -472,9 +438,7 @@ def test_static_content_range_error(app, file_name, static_file_directory): # blueprint uri = app.url_for("static", name="test_bp_static.static") assert uri == "/bp/testing.file" - assert uri == app.url_for( - "static", name="test_bp_static.static", filename="any" - ) + assert uri == app.url_for("static", name="test_bp_static.static", filename="any") assert uri == app.url_for("test_bp_static.static") assert uri == app.url_for("test_bp_static.static", filename="any") diff --git a/tests/test_ws_handlers.py b/tests/test_ws_handlers.py index 81681d0f..87ac06e9 100644 --- a/tests/test_ws_handlers.py +++ b/tests/test_ws_handlers.py @@ -5,9 +5,7 @@ from websockets.client import WebSocketClientProtocol from sanic import Request, Sanic, Websocket -MimicClientType = Callable[ - [WebSocketClientProtocol], Coroutine[None, None, Any] -] +MimicClientType = Callable[[WebSocketClientProtocol], Coroutine[None, None, Any]] @pytest.fixture @@ -31,9 +29,7 @@ def test_ws_handler( msg = await ws.recv() await ws.send(msg) - _, ws_proxy = app.test_client.websocket( - "/ws", mimic=simple_ws_mimic_client - ) + _, ws_proxy = app.test_client.websocket("/ws", mimic=simple_ws_mimic_client) assert ws_proxy.client_sent == ["test 1", "test 2", ""] assert ws_proxy.client_received == ["test 1", "test 2"] @@ -47,8 +43,6 @@ def test_ws_handler_async_for( async for msg in ws: await ws.send(msg) - _, ws_proxy = app.test_client.websocket( - "/ws", mimic=simple_ws_mimic_client - ) + _, ws_proxy = app.test_client.websocket("/ws", mimic=simple_ws_mimic_client) assert ws_proxy.client_sent == ["test 1", "test 2", ""] assert ws_proxy.client_received == ["test 1", "test 2"] diff --git a/tests/typing/samples/request_fully_custom.py b/tests/typing/samples/request_fully_custom.py index e2ec4b31..e094d68c 100644 --- a/tests/typing/samples/request_fully_custom.py +++ b/tests/typing/samples/request_fully_custom.py @@ -22,9 +22,7 @@ class CustomRequest(Request[Sanic[CustomConfig, Foo], RequestContext]): return ctx -app = Sanic( - "test", config=CustomConfig(), ctx=Foo(), request_class=CustomRequest -) +app = Sanic("test", config=CustomConfig(), ctx=Foo(), request_class=CustomRequest) @app.get("/") diff --git a/tests/typing/test_typing.py b/tests/typing/test_typing.py index 77e106c1..424b5163 100644 --- a/tests/typing/test_typing.py +++ b/tests/typing/test_typing.py @@ -92,9 +92,7 @@ def run_check(path_location: str) -> str: ), ), ) -def test_check_app_default( - path_location: str, expected: List[Tuple[str, int]] -) -> None: +def test_check_app_default(path_location: str, expected: List[Tuple[str, int]]) -> None: output = run_check(f"samples/{path_location}") for text, number in expected: diff --git a/tests/worker/test_inspector.py b/tests/worker/test_inspector.py index 32b65785..cf06c2cb 100644 --- a/tests/worker/test_inspector.py +++ b/tests/worker/test_inspector.py @@ -127,9 +127,9 @@ def test_state_to_json(): def test_run_inspector_authentication(): - inspector = Inspector( - Mock(), {}, {}, "", 0, "super-secret", Default(), Default() - )(False) + inspector = Inspector(Mock(), {}, {}, "", 0, "super-secret", Default(), Default())( + False + ) manager = TestManager(inspector.app) _, response = manager.test_client.get("/") assert response.status == 401 diff --git a/tests/worker/test_manager.py b/tests/worker/test_manager.py index bc50ad87..4753b07d 100644 --- a/tests/worker/test_manager.py +++ b/tests/worker/test_manager.py @@ -62,9 +62,7 @@ def test_kill(os_mock: Mock): @patch("sanic.worker.process.os") @patch("sanic.worker.manager.os") -def test_shutdown_signal_send_kill( - manager_os_mock: Mock, process_os_mock: Mock -): +def test_shutdown_signal_send_kill(manager_os_mock: Mock, process_os_mock: Mock): process = Mock() process.pid = 1234 context = Mock() @@ -124,9 +122,7 @@ def test_monitor_all(zero_downtime): p2 = Mock() sub = Mock() incoming = ( - "__ALL_PROCESSES__::STARTUP_FIRST" - if zero_downtime - else "__ALL_PROCESSES__:" + "__ALL_PROCESSES__::STARTUP_FIRST" if zero_downtime else "__ALL_PROCESSES__:" ) sub.recv.side_effect = [incoming, ""] context = Mock() @@ -137,9 +133,7 @@ def test_monitor_all(zero_downtime): manager.monitor() restart_order = ( - RestartOrder.STARTUP_FIRST - if zero_downtime - else RestartOrder.SHUTDOWN_FIRST + RestartOrder.STARTUP_FIRST if zero_downtime else RestartOrder.SHUTDOWN_FIRST ) manager.restart.assert_called_once_with( process_names=None, @@ -167,9 +161,7 @@ def test_monitor_all_with_files(zero_downtime): manager.monitor() restart_order = ( - RestartOrder.STARTUP_FIRST - if zero_downtime - else RestartOrder.SHUTDOWN_FIRST + RestartOrder.STARTUP_FIRST if zero_downtime else RestartOrder.SHUTDOWN_FIRST ) manager.restart.assert_called_once_with( process_names=None, @@ -185,9 +177,7 @@ def test_monitor_one_process(zero_downtime): p2 = Mock() sub = Mock() incoming = ( - f"{p1.name}:foo,bar:STARTUP_FIRST" - if zero_downtime - else f"{p1.name}:foo,bar" + f"{p1.name}:foo,bar:STARTUP_FIRST" if zero_downtime else f"{p1.name}:foo,bar" ) sub.recv.side_effect = [incoming, ""] context = Mock() @@ -198,9 +188,7 @@ def test_monitor_one_process(zero_downtime): manager.monitor() restart_order = ( - RestartOrder.STARTUP_FIRST - if zero_downtime - else RestartOrder.SHUTDOWN_FIRST + RestartOrder.STARTUP_FIRST if zero_downtime else RestartOrder.SHUTDOWN_FIRST ) manager.restart.assert_called_once_with( process_names=[p1.name], diff --git a/tests/worker/test_reloader.py b/tests/worker/test_reloader.py index 6f441b5e..b7a27878 100644 --- a/tests/worker/test_reloader.py +++ b/tests/worker/test_reloader.py @@ -154,9 +154,7 @@ def test_reload_delayed(monkeypatch): monkeypatch.setattr(threading.Thread, "start", orig) -def test_reloader_triggers_start_stop_listeners( - app: Sanic, app_loader: AppLoader -): +def test_reloader_triggers_start_stop_listeners(app: Sanic, app_loader: AppLoader): results = [] @app.reload_process_start diff --git a/tests/worker/test_state.py b/tests/worker/test_state.py index 7d7c6bf6..d934e8c3 100644 --- a/tests/worker/test_state.py +++ b/tests/worker/test_state.py @@ -43,21 +43,15 @@ def test_state_eq(): def test_state_keys(): - assert list(gen_state(one=1, two=2).keys()) == list( - {"one": 1, "two": 2}.keys() - ) + assert list(gen_state(one=1, two=2).keys()) == list({"one": 1, "two": 2}.keys()) def test_state_values(): - assert list(gen_state(one=1, two=2).values()) == list( - {"one": 1, "two": 2}.values() - ) + assert list(gen_state(one=1, two=2).values()) == list({"one": 1, "two": 2}.values()) def test_state_items(): - assert list(gen_state(one=1, two=2).items()) == list( - {"one": 1, "two": 2}.items() - ) + assert list(gen_state(one=1, two=2).items()) == list({"one": 1, "two": 2}.items()) def test_state_update(): diff --git a/tests/worker/test_worker_serve.py b/tests/worker/test_worker_serve.py index 5cee5408..3d8dd8fb 100644 --- a/tests/worker/test_worker_serve.py +++ b/tests/worker/test_worker_serve.py @@ -66,9 +66,7 @@ def test_has_multiplexer(app: Sanic): Sanic.register_app(app) with patch("sanic.worker.serve._serve_http_1"): - worker_serve( - **args(app, monitor_publisher=Mock(), worker_state=Mock()) - ) + worker_serve(**args(app, monitor_publisher=Mock(), worker_state=Mock())) assert isinstance(app.multiplexer, WorkerMultiplexer) del environ["SANIC_WORKER_NAME"] @@ -102,9 +100,7 @@ def test_serve_app_factory(wm: Mock, mock_app): @patch("sanic.mixins.startup.WorkerManager") @pytest.mark.parametrize("config", (True, False)) -def test_serve_with_inspector( - WorkerManager: Mock, mock_app: Mock, config: bool -): +def test_serve_with_inspector(WorkerManager: Mock, mock_app: Mock, config: bool): Inspector = Mock() mock_app.config.INSPECTOR = config mock_app.inspector_class = Inspector