From 1b5dc8b9c3ea44d3ab0609a644af8dad8592fdcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:47:26 +0000 Subject: [PATCH 1/2] Bump the python-packages group with 5 updates Bumps the python-packages group with 5 updates: | Package | From | To | | --- | --- | --- | | [importlib-metadata](https://github.com/python/importlib_metadata) | `8.5.0` | `8.6.1` | | [ruff](https://github.com/astral-sh/ruff) | `0.8.5` | `0.9.4` | | [black](https://github.com/psf/black) | `24.10.0` | `25.1.0` | | [mkdocs-material](https://github.com/squidfunk/mkdocs-material) | `9.5.49` | `9.6.1` | | [twine](https://github.com/pypa/twine) | `6.0.1` | `6.1.0` | Updates `importlib-metadata` from 8.5.0 to 8.6.1 - [Release notes](https://github.com/python/importlib_metadata/releases) - [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst) - [Commits](https://github.com/python/importlib_metadata/compare/v8.5.0...v8.6.1) Updates `ruff` from 0.8.5 to 0.9.4 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.8.5...0.9.4) Updates `black` from 24.10.0 to 25.1.0 - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/24.10.0...25.1.0) Updates `mkdocs-material` from 9.5.49 to 9.6.1 - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.49...9.6.1) Updates `twine` from 6.0.1 to 6.1.0 - [Release notes](https://github.com/pypa/twine/releases) - [Changelog](https://github.com/pypa/twine/blob/main/docs/changelog.rst) - [Commits](https://github.com/pypa/twine/compare/6.0.1...6.1.0) --- updated-dependencies: - dependency-name: importlib-metadata dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: ruff dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: black dependency-type: direct:production update-type: version-update:semver-major dependency-group: python-packages - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages - dependency-name: twine dependency-type: direct:production update-type: version-update:semver-minor dependency-group: python-packages ... Signed-off-by: dependabot[bot] --- requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 88d6fb011..579b5e729 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,9 +3,9 @@ # Testing coverage==7.6.10 -importlib-metadata==8.5.0 +importlib-metadata==8.6.1 mypy==1.14.1 -ruff==0.8.5 +ruff==0.9.4 typing_extensions==4.12.2 types-contextvars==2.4.7.3 types-PyYAML==6.0.12.20241230 @@ -14,11 +14,11 @@ pytest==8.3.4 trio==0.28.0 # Documentation -black==24.10.0 +black==25.1.0 mkdocs==1.6.1 -mkdocs-material==9.5.49 +mkdocs-material==9.6.1 mkdocstrings-python==1.13.0 # Packaging build==1.2.2.post1 -twine==6.0.1 +twine==6.1.0 From d49bc92a11c4ed06a6c1b63a915c31164eff7d27 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sun, 2 Feb 2025 12:09:59 +0100 Subject: [PATCH 2/2] pass pipeline --- starlette/applications.py | 6 +++--- starlette/datastructures.py | 7 +------ starlette/requests.py | 6 +++--- starlette/responses.py | 5 +---- starlette/routing.py | 3 +-- starlette/staticfiles.py | 6 +++--- tests/test_formparsers.py | 18 +++++++++--------- tests/test_responses.py | 4 ++-- 8 files changed, 23 insertions(+), 32 deletions(-) diff --git a/starlette/applications.py b/starlette/applications.py index 0a717bb3a..6df5a707c 100644 --- a/starlette/applications.py +++ b/starlette/applications.py @@ -65,9 +65,9 @@ def __init__( """ # The lifespan context function is a newer style that replaces # on_startup / on_shutdown handlers. Use one or the other, not both. - assert lifespan is None or ( - on_startup is None and on_shutdown is None - ), "Use either 'lifespan' or 'on_startup'/'on_shutdown', not both." + assert lifespan is None or (on_startup is None and on_shutdown is None), ( + "Use either 'lifespan' or 'on_startup'/'on_shutdown', not both." + ) self.debug = debug self.state = State() diff --git a/starlette/datastructures.py b/starlette/datastructures.py index 90a7296a0..f5d74d25f 100644 --- a/starlette/datastructures.py +++ b/starlette/datastructures.py @@ -461,12 +461,7 @@ async def close(self) -> None: await run_in_threadpool(self.file.close) def __repr__(self) -> str: - return ( - f"{self.__class__.__name__}(" - f"filename={self.filename!r}, " - f"size={self.size!r}, " - f"headers={self.headers!r})" - ) + return f"{self.__class__.__name__}(filename={self.filename!r}, size={self.size!r}, headers={self.headers!r})" class FormData(ImmutableMultiDict[str, typing.Union[UploadFile, str]]): diff --git a/starlette/requests.py b/starlette/requests.py index 369f632e5..7dc04a746 100644 --- a/starlette/requests.py +++ b/starlette/requests.py @@ -257,9 +257,9 @@ async def _get_form( max_part_size: int = 1024 * 1024, ) -> FormData: if self._form is None: # pragma: no branch - assert ( - parse_options_header is not None - ), "The `python-multipart` library must be installed to use form parsing." + assert parse_options_header is not None, ( + "The `python-multipart` library must be installed to use form parsing." + ) content_type_header = self.headers.get("Content-Type") content_type: bytes content_type, _ = parse_options_header(content_type_header) diff --git a/starlette/responses.py b/starlette/responses.py index 31874f655..5964df678 100644 --- a/starlette/responses.py +++ b/starlette/responses.py @@ -529,9 +529,6 @@ def generate_multipart( return ( content_length, lambda start, end: ( - f"--{boundary}\n" - f"Content-Type: {content_type}\n" - f"Content-Range: bytes {start}-{end-1}/{max_size}\n" - "\n" + f"--{boundary}\nContent-Type: {content_type}\nContent-Range: bytes {start}-{end - 1}/{max_size}\n\n" ).encode("latin-1"), ) diff --git a/starlette/routing.py b/starlette/routing.py index 74daeadb0..add7df0c2 100644 --- a/starlette/routing.py +++ b/starlette/routing.py @@ -623,8 +623,7 @@ def __init__( ) elif inspect.isgeneratorfunction(lifespan): warnings.warn( - "generator function lifespans are deprecated, " - "use an @contextlib.asynccontextmanager function instead", + "generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead", DeprecationWarning, ) self.lifespan_context = _wrap_gen_lifespan_context( diff --git a/starlette/staticfiles.py b/starlette/staticfiles.py index 34be04cdc..02848241e 100644 --- a/starlette/staticfiles.py +++ b/starlette/staticfiles.py @@ -77,9 +77,9 @@ def get_directories( assert spec is not None, f"Package {package!r} could not be found." assert spec.origin is not None, f"Package {package!r} could not be found." package_directory = os.path.normpath(os.path.join(spec.origin, "..", statics_dir)) - assert os.path.isdir( - package_directory - ), f"Directory '{statics_dir!r}' in package {package!r} could not be found." + assert os.path.isdir(package_directory), ( + f"Directory '{statics_dir!r}' in package {package!r} could not be found." + ) directories.append(package_directory) return directories diff --git a/tests/test_formparsers.py b/tests/test_formparsers.py index 70beebc3f..b18fd6c40 100644 --- a/tests/test_formparsers.py +++ b/tests/test_formparsers.py @@ -484,7 +484,7 @@ def test_too_many_fields_raise( client = test_client_factory(app) fields = [] for i in range(1001): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="N{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -511,7 +511,7 @@ def test_too_many_files_raise( client = test_client_factory(app) fields = [] for i in range(1001): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N{i}"; filename="F{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="N{i}"; filename="F{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -540,7 +540,7 @@ def test_too_many_files_single_field_raise( for i in range(1001): # This uses the same field name "N" for all files, equivalent to a # multifile upload form field - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N"; filename="F{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="N"; filename="F{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -567,8 +567,8 @@ def test_too_many_files_and_fields_raise( client = test_client_factory(app) fields = [] for i in range(1001): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n' "\r\n") - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n\r\n') + fields.append(f'--B\r\nContent-Disposition: form-data; name="N{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -598,7 +598,7 @@ def test_max_fields_is_customizable_low_raises( client = test_client_factory(app) fields = [] for i in range(2): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="N{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -628,7 +628,7 @@ def test_max_files_is_customizable_low_raises( client = test_client_factory(app) fields = [] for i in range(2): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") with expectation: res = client.post( @@ -644,8 +644,8 @@ def test_max_fields_is_customizable_high(test_client_factory: TestClientFactory) client = test_client_factory(make_app_max_parts(max_fields=2000, max_files=2000)) fields = [] for i in range(2000): - fields.append("--B\r\n" f'Content-Disposition: form-data; name="N{i}";\r\n\r\n' "\r\n") - fields.append("--B\r\n" f'Content-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n' "\r\n") + fields.append(f'--B\r\nContent-Disposition: form-data; name="N{i}";\r\n\r\n\r\n') + fields.append(f'--B\r\nContent-Disposition: form-data; name="F{i}"; filename="F{i}";\r\n\r\n\r\n') data = "".join(fields).encode("utf-8") data += b"--B--\r\n" res = client.post( diff --git a/tests/test_responses.py b/tests/test_responses.py index d5ed83499..0a00e9369 100644 --- a/tests/test_responses.py +++ b/tests/test_responses.py @@ -687,12 +687,12 @@ def test_file_response_range_invalid(file_response_client: TestClient) -> None: def test_file_response_range_head_max(file_response_client: TestClient) -> None: - response = file_response_client.head("/", headers={"Range": f"bytes=0-{len(README.encode('utf8'))+1}"}) + response = file_response_client.head("/", headers={"Range": f"bytes=0-{len(README.encode('utf8')) + 1}"}) assert response.status_code == 206 def test_file_response_range_416(file_response_client: TestClient) -> None: - response = file_response_client.head("/", headers={"Range": f"bytes={len(README.encode('utf8'))+1}-"}) + response = file_response_client.head("/", headers={"Range": f"bytes={len(README.encode('utf8')) + 1}-"}) assert response.status_code == 416 assert response.headers["Content-Range"] == f"*/{len(README.encode('utf8'))}"