diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index 551e72005f..90e73f6989 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -1,28 +1,39 @@ -name: Publish Artifacts +name: Upload Python Package + on: release: types: [created] - + workflow_dispatch: jobs: - publishPythonPackage: - name: Publishing Sanic Release Artifacts + build-n-publish: + name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI runs-on: ubuntu-latest - - strategy: - fail-fast: true - matrix: - python-version: ["3.10"] - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Publish Python Package - uses: harshanarayana/custom-actions@main - with: - python-version: ${{ matrix.python-version }} - package-infra-name: "twine" - pypi-user: __token__ - pypi-access-token: ${{ secrets.PYPI_ACCESS_TOKEN }} - action: "package-publish" - pypi-verify-metadata: "true" + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: >- + python3 -m + build + --sdist + --wheel + --outdir dist/ + . + - name: Publish distribution 📦 to Test PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.SANIC_TEST_PYPI_API_TOKEN }} + repository-url: https://test.pypi.org/legacy/ + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.SANIC_PYPI_API_TOKEN }} \ No newline at end of file diff --git a/docs/sanic/changelog.rst b/docs/sanic/changelog.rst index 61787e9788..b8a806cdd0 100644 --- a/docs/sanic/changelog.rst +++ b/docs/sanic/changelog.rst @@ -5,6 +5,7 @@ | 🔷 In support release | +.. mdinclude:: ./releases/23/23.6.md .. mdinclude:: ./releases/23/23.3.md .. mdinclude:: ./releases/22/22.12.md .. mdinclude:: ./releases/22/22.9.md diff --git a/docs/sanic/releases/23/23.3.md b/docs/sanic/releases/23/23.3.md index 0c0ecbb907..45dfff0852 100644 --- a/docs/sanic/releases/23/23.3.md +++ b/docs/sanic/releases/23/23.3.md @@ -1,4 +1,4 @@ -## Version 23.3.0 🔶 +## Version 23.3.0 ### Features - [#2545](https://github.com/sanic-org/sanic/pull/2545) Standardize init of exceptions for more consistent control of HTTP responses using exceptions diff --git a/docs/sanic/releases/23/23.6.md b/docs/sanic/releases/23/23.6.md new file mode 100644 index 0000000000..8f0e623ae0 --- /dev/null +++ b/docs/sanic/releases/23/23.6.md @@ -0,0 +1,33 @@ +## Version 23.6.0 🔶 + +### Features +- [#2670](https://github.com/sanic-org/sanic/pull/2670) Increase `KEEP_ALIVE_TIMEOUT` default to 120 seconds +- [#2716](https://github.com/sanic-org/sanic/pull/2716) Adding allow route overwrite option in blueprint +- [#2724](https://github.com/sanic-org/sanic/pull/2724) and [#2792](https://github.com/sanic-org/sanic/pull/2792) Add a new exception signal for ALL exceptions raised anywhere in application +- [#2727](https://github.com/sanic-org/sanic/pull/2727) Add name prefixing to BP groups +- [#2754](https://github.com/sanic-org/sanic/pull/2754) Update request type on middleware types +- [#2770](https://github.com/sanic-org/sanic/pull/2770) Better exception message on startup time application induced import error +- [#2776](https://github.com/sanic-org/sanic/pull/2776) Set multiprocessing start method early +- [#2785](https://github.com/sanic-org/sanic/pull/2785) Add custom typing to config and ctx objects +- [#2790](https://github.com/sanic-org/sanic/pull/2790) Add `request.client_ip` + +### Bugfixes +- [#2728](https://github.com/sanic-org/sanic/pull/2728) Fix traversals for intended results +- [#2729](https://github.com/sanic-org/sanic/pull/2729) Handle case when headers argument of ResponseStream constructor is None +- [#2737](https://github.com/sanic-org/sanic/pull/2737) Fix type annotation for `JSONREsponse` default content type +- [#2740](https://github.com/sanic-org/sanic/pull/2740) Use Sanic's serializer for JSON responses in the Inspector +- [#2760](https://github.com/sanic-org/sanic/pull/2760) Support for `Request.get_current` in ASGI mode +- [#2773](https://github.com/sanic-org/sanic/pull/2773) Alow Blueprint routes to explicitly define error_format +- [#2774](https://github.com/sanic-org/sanic/pull/2774) Resolve headers on different renderers +- [#2782](https://github.com/sanic-org/sanic/pull/2782) Resolve pypy compatibility issues + +### Deprecations and Removals +- [#2777](https://github.com/sanic-org/sanic/pull/2777) Remove Python 3.7 support + +### Developer infrastructure +- [#2766](https://github.com/sanic-org/sanic/pull/2766) Unpin setuptools version +- [#2779](https://github.com/sanic-org/sanic/pull/2779) Run keep alive tests in loop to get available port + +### Improved Documentation +- [#2741](https://github.com/sanic-org/sanic/pull/2741) Better documentation examples about running Sanic +From that list, the items to highlight in the release notes: diff --git a/sanic/__version__.py b/sanic/__version__.py index 3fc900d3f6..e49b808fad 100644 --- a/sanic/__version__.py +++ b/sanic/__version__.py @@ -1 +1 @@ -__version__ = "23.3.1" +__version__ = "23.6.0" diff --git a/sanic/mixins/exceptions.py b/sanic/mixins/exceptions.py index fc5b82ef58..f78839fb4c 100644 --- a/sanic/mixins/exceptions.py +++ b/sanic/mixins/exceptions.py @@ -38,3 +38,15 @@ def decorator(handler): return handler return decorator + + def all_exceptions(self, handler): + """ + This method enables the process of creating a global exception + handler for the current blueprint under question. + + :param handler: A coroutine function to handle exceptions + + :return a decorated method to handle global exceptions for any + route registered under this blueprint. + """ + return self.exception(Exception)(handler) diff --git a/sanic/mixins/signals.py b/sanic/mixins/signals.py index d3d67ac6b9..9f0a81a57e 100644 --- a/sanic/mixins/signals.py +++ b/sanic/mixins/signals.py @@ -4,7 +4,7 @@ from sanic.base.meta import SanicMeta from sanic.models.futures import FutureSignal from sanic.models.handler_types import SignalHandler -from sanic.signals import Signal +from sanic.signals import Event, Signal from sanic.types import HashableDict @@ -80,3 +80,9 @@ async def noop(): def event(self, event: str): raise NotImplementedError + + def catch_exception(self, handler): + async def signal_handler(exception: Exception): + await handler(self, exception) + + self.signal(Event.SERVER_LIFECYCLE_EXCEPTION)(signal_handler) diff --git a/sanic/signals.py b/sanic/signals.py index 3075dbaa38..12fc9f4ea3 100644 --- a/sanic/signals.py +++ b/sanic/signals.py @@ -230,14 +230,6 @@ def add( # type: ignore if not trigger: event = ".".join([*parts[:2], "<__trigger__>"]) - try: - # Attaching __requirements__ and __trigger__ to the handler - # is deprecated and will be removed in v23.6. - handler.__requirements__ = condition # type: ignore - handler.__trigger__ = trigger # type: ignore - except AttributeError: - pass - signal = super().add( event, handler, diff --git a/setup.py b/setup.py index 1f321a9fdb..51369ded58 100644 --- a/setup.py +++ b/setup.py @@ -103,7 +103,7 @@ def str_to_bool(val: str) -> bool: uvloop = "uvloop>=0.15.0" + env_dependency types_ujson = "types-ujson" + env_dependency requirements = [ - "sanic-routing>=22.8.0", + "sanic-routing>=23.6.0", "httptools>=0.0.10", uvloop, ujson, @@ -116,7 +116,7 @@ def str_to_bool(val: str) -> bool: ] tests_require = [ - "sanic-testing>=23.3.0", + "sanic-testing>=23.6.0", "pytest==7.1.*", "coverage", "beautifulsoup4", diff --git a/tests/test_redirect.py b/tests/test_redirect.py index 85375cc311..d9a08c1100 100644 --- a/tests/test_redirect.py +++ b/tests/test_redirect.py @@ -126,7 +126,7 @@ async def init_handler(request, test): @app.route("/api/v2/test//", unquote=True) async def target_handler(request, test): - assert test == test_str + assert test == quote(test_str) return text("OK") _, response = app.test_client.get(f"/api/v1/test/{use_in_uri}/")