1
0
forked from pool/python-falcon

17 Commits

Author SHA256 Message Date
d7caaf1f31 Accepting request 1317338 from devel:languages:python
OBS-URL: https://build.opensuse.org/request/show/1317338
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=31
2025-11-12 20:16:28 +00:00
0ac6659d91 4.2.0
* Typing enhancements and performance optimizations
  * Fix reproducible builds of docs

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=72
2025-11-12 13:50:54 +00:00
d568f7e102 Accepting request 1314117 from devel:languages:python
OBS-URL: https://build.opensuse.org/request/show/1314117
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=30
2025-10-29 20:05:45 +00:00
8bba6cd630 - Update to 4.1.0
* CPython 3.14 is now fully supported. (#2413)
  * Although the Falcon 4.x series is only guaranteed to support Python 3.10+,
    this release still supports 3.8 & 3.9 at runtime using the pure Python wheel.
  * Falcon 4.2 is expected to drop the end-of-life Python 3.8 completely (but
    runtime support will continue for 3.9 on a best effort basis).
  * StaticRoute now renders Etag headers. It also checks If-None-Match in requests
    and returns HTTP 304 response if appropriate. (#2243)
  * StaticRoute now sets the Last-Modified header when serving static files. The
    improved implementation also checks the value of the If-Modified-Since header,
    and renders an HTTP 304 response when the requested file has not been modified. (#2244)
  * Similar to create_environ(), the create_scope() testing helper now preserves the
    raw URI path, and propagates it to the created ASGI connection scope as the
    raw_path byte string (according to the ASGI specification). (#2262)
  * Two new media_type constants, falcon.MEDIA_CSV and falcon.MEDIA_PARQUET, were
    added in order to provide better support for Python data analysis applications
    out of the box. (#2335)
  * Support for allowing cross-origin private network access was added to the built-in
    CORSMiddleware. The new feature is off by default, and can be enabled by passing
    the keyword argument allow_private_network=True to CORSMiddleware during
    initialization. (#2381)
  * The falcon.secure_filename() utility function can now ensure that the length of the
    sanitized filename does not exceed the requested limit (passed via the max_length
    argument). In addition, a new option, max_secure_filename_length, was added to
    MultipartParseOptions in order to automatically populate this argument when
    referencing a body part’s secure_filename. (#2420)
  * The unset_cookie() method now accepts a same_site parameter (with underscore) for
    consistency with set_cookie(). The previous samesite parameter (without underscore)
    is now deprecated (referencing it will emit a deprecation warning). (#2453)
  * A new method, __rich__, has been added to falcon.testing.Result for facilitating

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=70
2025-10-28 16:25:43 +00:00
15db1c7b10 Accepting request 1300396 from devel:languages:python
- Convert to libalternatives on SLE-16-based and newer systems

OBS-URL: https://build.opensuse.org/request/show/1300396
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=29
2025-08-20 11:26:19 +00:00
a2b3838aaf OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=68 2025-08-20 06:49:35 +00:00
a6380da2fc - Convert to libalternatives on SLE-16-based and newer systems
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=67
2025-08-19 12:25:48 +00:00
0d376a7d0e Accepting request 1291282 from devel:languages:python
- Convert to libalternatives

OBS-URL: https://build.opensuse.org/request/show/1291282
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=28
2025-07-09 15:27:45 +00:00
eb5851ecc2 - Convert to libalternatives
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=65
2025-07-08 13:24:23 +00:00
828e29922b Accepting request 1256063 from devel:languages:python
OBS-URL: https://build.opensuse.org/request/show/1256063
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=27
2025-03-26 20:19:44 +00:00
322d819fee - Add websockets.patch to fix test failure
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=63
2025-03-25 20:52:57 +00:00
03cdd46458 Accepting request 1236160 from devel:languages:python
- Build doc package just for tumbleweed to remove
  pydata-sphinx-theme requirement

OBS-URL: https://build.opensuse.org/request/show/1236160
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=26
2025-01-12 10:14:02 +00:00
823c2f6e8e - Build doc package just for tumbleweed to remove
pydata-sphinx-theme requirement

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=61
2025-01-09 12:05:38 +00:00
ec693d0a80 Accepting request 1223760 from devel:languages:python
OBS-URL: https://build.opensuse.org/request/show/1223760
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=25
2024-11-13 14:28:29 +00:00
47f9b5d457 - Update to 4.0.2
* Running Mypy on code that uses parts of falcon.testing would
    previously lead to errors like:
     "Name "falcon.testing.TestClient" is not defined"
    This has been fixed by explicitly exporting the names that
    are imported into the falcon.testing namespace. (#2387)
  * The printable PDF version of our documentation was enabled
    on Read the Docs. (#2365)

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=59
2024-11-12 17:08:27 +00:00
5edd96e9d9 Accepting request 1220150 from devel:languages:python
- Update to 4.0.1:
  * Overview
    + CPython 3.11 - 3.13 is now fully supported.
    + End-of-life Python 3.5, 3.6 & 3.7 are no longer supported.
    + End-of-life Python 3.8 is no longer actively supported.
    + Type checking support was introduced.
    + Falcon is no longer vendoring the python-mimeparse library.
    + A number of undocumented internal helpers were renamed to start with an
      underscore.
    + A number of previously deprecated methods, attributes and classes have
      now been removed.
    + We decided, on the other hand, to keep the deprecated falcon.API alias
      until Falcon 5.0.
    + The deprecated api_helpers was removed in favor of the app_helpers
      module.
    + The function falcon.http_date_to_dt now validates HTTP dates to have
      the correct timezone set. It now also returns timezone-aware
      datetime.datetime objects.
    + setup.cfg was dropped in favor of consolidating all static project
      configuration in pyproject.toml
  * New & Improved
    + A new path converter falcon.routing.PathConverter
      capable of matching segments that include / was added.
    + Similar to the existing falcon.routing.IntConverter, a new
      falcon.routing.FloatConverter has been added, allowing to convert
      path segments to float.
    + A new method falcon.Request.get_header_as_int was implemented.
    + A new property, falcon.Request.headers_lower, was added to provide a
      unified, self-documenting way to get a copy of all request headers with
      lowercase names to facilitate case-insensitive matching.

OBS-URL: https://build.opensuse.org/request/show/1220150
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/python-falcon?expand=0&rev=24
2024-11-02 15:11:54 +00:00
c74f12e20f - Update to 4.0.1:
* Overview
    + CPython 3.11 - 3.13 is now fully supported.
    + End-of-life Python 3.5, 3.6 & 3.7 are no longer supported.
    + End-of-life Python 3.8 is no longer actively supported.
    + Type checking support was introduced.
    + Falcon is no longer vendoring the python-mimeparse library.
    + A number of undocumented internal helpers were renamed to start with an
      underscore.
    + A number of previously deprecated methods, attributes and classes have
      now been removed.
    + We decided, on the other hand, to keep the deprecated falcon.API alias
      until Falcon 5.0.
    + The deprecated api_helpers was removed in favor of the app_helpers
      module.
    + The function falcon.http_date_to_dt now validates HTTP dates to have
      the correct timezone set. It now also returns timezone-aware
      datetime.datetime objects.
    + setup.cfg was dropped in favor of consolidating all static project
      configuration in pyproject.toml
  * New & Improved
    + A new path converter falcon.routing.PathConverter
      capable of matching segments that include / was added.
    + Similar to the existing falcon.routing.IntConverter, a new
      falcon.routing.FloatConverter has been added, allowing to convert
      path segments to float.
    + A new method falcon.Request.get_header_as_int was implemented.
    + A new property, falcon.Request.headers_lower, was added to provide a
      unified, self-documenting way to get a copy of all request headers with
      lowercase names to facilitate case-insensitive matching.

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-falcon?expand=0&rev=57
2024-11-02 06:34:21 +00:00
6 changed files with 198 additions and 225 deletions

Binary file not shown.

3
falcon-4.2.0.tar.gz Normal file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c13e86e49696d6655411fe09473c34997e49ff45e8cdf7576297b0ca71ceac3d
size 665894

View File

@@ -1,13 +0,0 @@
Index: falcon-3.1.3/docs/conf.py
===================================================================
--- falcon-3.1.3.orig/docs/conf.py
+++ falcon-3.1.3/docs/conf.py
@@ -132,7 +132,7 @@ exclude_patterns = ['_build', '_newsfrag
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'github'
+pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []

View File

@@ -1,3 +1,151 @@
-------------------------------------------------------------------
Wed Nov 12 11:43:09 UTC 2025 - Bernhard Wiedemann <bwiedemann@suse.com>
- 4.2.0
* Typing enhancements and performance optimizations
* Fix reproducible builds of docs
-------------------------------------------------------------------
Tue Oct 28 09:03:20 UTC 2025 - John Paul Adrian Glaubitz <adrian.glaubitz@suse.com>
- Update to 4.1.0
* CPython 3.14 is now fully supported. (#2413)
* Although the Falcon 4.x series is only guaranteed to support Python 3.10+,
this release still supports 3.8 & 3.9 at runtime using the pure Python wheel.
* Falcon 4.2 is expected to drop the end-of-life Python 3.8 completely (but
runtime support will continue for 3.9 on a best effort basis).
* StaticRoute now renders Etag headers. It also checks If-None-Match in requests
and returns HTTP 304 response if appropriate. (#2243)
* StaticRoute now sets the Last-Modified header when serving static files. The
improved implementation also checks the value of the If-Modified-Since header,
and renders an HTTP 304 response when the requested file has not been modified. (#2244)
* Similar to create_environ(), the create_scope() testing helper now preserves the
raw URI path, and propagates it to the created ASGI connection scope as the
raw_path byte string (according to the ASGI specification). (#2262)
* Two new media_type constants, falcon.MEDIA_CSV and falcon.MEDIA_PARQUET, were
added in order to provide better support for Python data analysis applications
out of the box. (#2335)
* Support for allowing cross-origin private network access was added to the built-in
CORSMiddleware. The new feature is off by default, and can be enabled by passing
the keyword argument allow_private_network=True to CORSMiddleware during
initialization. (#2381)
* The falcon.secure_filename() utility function can now ensure that the length of the
sanitized filename does not exceed the requested limit (passed via the max_length
argument). In addition, a new option, max_secure_filename_length, was added to
MultipartParseOptions in order to automatically populate this argument when
referencing a body parts secure_filename. (#2420)
* The unset_cookie() method now accepts a same_site parameter (with underscore) for
consistency with set_cookie(). The previous samesite parameter (without underscore)
is now deprecated (referencing it will emit a deprecation warning). (#2453)
* A new method, __rich__, has been added to falcon.testing.Result for facilitating
a rich-text representation when used together with the popular rich library.
* The cythonization process was revised in the light of the performance improvements
in newer CPython versions (especially 3.12+), and the compilation is now largely
confined to hand-crafted C/Cython code. As a result, the framework should run even
faster on modern CPython. (#2470)
* JSONHandler can now detect a non-standard (not a subclass of ValueError) deserialization
error type for a custom loads function.
(Normally, json.loads() and third party alternatives do raise a subclass of ValueError
on invalid input data, however, this is not the case for, e.g., the popular msgspec
library at the time of writing.) (#2476)
* Previously, Falcons WebSocket implementation was not documented to route the request
to any sink. However, in the case of a missing route, a matching sink was actually
invoked, passing ws in place of the incompatible resp.
This mismatch has been addressed by introducing a ws keyword argument (similar to
ASGI error handlers) for sink functions meant to accept WebSocket connections.
For backwards-compatibility, when ws is absent from the sinks signature, the WebSocket
object is still passed in place of the incompatible resp. This behavior will change in
Falcon 5.0: when draining a WebSocket connection, resp will always be set to None. (#2414)
* The readability of the Contributing docs was improved by properly rendering GitHub
Markdown-flavored checkboxes. (#2318)
* The falcon.testing.httpnow compatibility alias is now considered deprecated, and will
be removed in Falcon 5.0. Use the falcon.http_now() function instead. (#2389)
- Drop websockets.patch, merged upstream
-------------------------------------------------------------------
Tue Aug 19 12:18:37 UTC 2025 - Markéta Machová <mmachova@suse.com>
- Convert to libalternatives on SLE-16-based and newer systems
-------------------------------------------------------------------
Tue Jul 8 13:19:46 UTC 2025 - Markéta Machová <mmachova@suse.com>
- Convert to libalternatives
-------------------------------------------------------------------
Tue Mar 25 15:51:05 UTC 2025 - Markéta Machová <mmachova@suse.com>
- Add websockets.patch to fix test failure
-------------------------------------------------------------------
Thu Jan 9 11:57:38 UTC 2025 - Daniel Garcia <daniel.garcia@suse.com>
- Build doc package just for tumbleweed to remove
pydata-sphinx-theme requirement
-------------------------------------------------------------------
Tue Nov 12 10:49:26 UTC 2024 - John Paul Adrian Glaubitz <adrian.glaubitz@suse.com>
- Update to 4.0.2
* Running Mypy on code that uses parts of falcon.testing would
previously lead to errors like:
"Name "falcon.testing.TestClient" is not defined"
This has been fixed by explicitly exporting the names that
are imported into the falcon.testing namespace. (#2387)
* The printable PDF version of our documentation was enabled
on Read the Docs. (#2365)
-------------------------------------------------------------------
Sat Nov 2 06:33:44 UTC 2024 - Steve Kowalik <steven.kowalik@suse.com>
- Update to 4.0.1:
* Overview
+ CPython 3.11 - 3.13 is now fully supported.
+ End-of-life Python 3.5, 3.6 & 3.7 are no longer supported.
+ End-of-life Python 3.8 is no longer actively supported.
+ Type checking support was introduced.
+ Falcon is no longer vendoring the python-mimeparse library.
+ A number of undocumented internal helpers were renamed to start with an
underscore.
+ A number of previously deprecated methods, attributes and classes have
now been removed.
+ We decided, on the other hand, to keep the deprecated falcon.API alias
until Falcon 5.0.
+ The deprecated api_helpers was removed in favor of the app_helpers
module.
+ The function falcon.http_date_to_dt now validates HTTP dates to have
the correct timezone set. It now also returns timezone-aware
datetime.datetime objects.
+ setup.cfg was dropped in favor of consolidating all static project
configuration in pyproject.toml
* New & Improved
+ A new path converter falcon.routing.PathConverter
capable of matching segments that include / was added.
+ Similar to the existing falcon.routing.IntConverter, a new
falcon.routing.FloatConverter has been added, allowing to convert
path segments to float.
+ A new method falcon.Request.get_header_as_int was implemented.
+ A new property, falcon.Request.headers_lower, was added to provide a
unified, self-documenting way to get a copy of all request headers with
lowercase names to facilitate case-insensitive matching.
+ In Python 3.13, the cgi module is removed entirely from the stdlib,
including its parse_header() method. Falcon addresses the issue by
shipping an own implementation.
+ The falcon.CORSMiddleware now properly handles the missing Allow
header case, by denying the preflight CORS request.
+ Added falcon.testing.Result.content_type and
falcon.testing.StreamedResult.content_type as a utility accessor
for the Content-Type header.
+ A new flag, falcon.ResponseOptions.xml_error_serialization, has been
added to falcon.ResponseOptions that can be used to disable automatic
XML serialization of falcon.HTTPError when using the default error
serializer (and the client prefers it).
* Fixed
+ The web servers used for tests are now run through sys.executable.
* Dropped patches, no longer required:
- python-falcon-sphinx-pygments-style.patch
- support-new-uvicorn.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Apr 2 01:45:24 UTC 2024 - Steve Kowalik <steven.kowalik@suse.com> Tue Apr 2 01:45:24 UTC 2024 - Steve Kowalik <steven.kowalik@suse.com>

View File

@@ -1,7 +1,7 @@
# #
# spec file for package python-falcon # spec file for package python-falcon
# #
# Copyright (c) 2024 SUSE LLC # Copyright (c) 2025 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@@ -16,29 +16,51 @@
# #
%if 0%{?suse_version} > 1600
%bcond_without doc
%else
%bcond_with doc
%endif
%if 0%{?suse_version} > 1500
%bcond_without libalternatives
%else
%bcond_with libalternatives
%endif
%{?sle15_python_module_pythons} %{?sle15_python_module_pythons}
Name: python-falcon Name: python-falcon
Version: 3.1.3 Version: 4.2.0
Release: 0 Release: 0
Summary: A web framework for building APIs and app backends Summary: A web framework for building APIs and app backends
License: Apache-2.0 License: Apache-2.0
URL: http://falconframework.org URL: https://falconframework.org
Source: https://files.pythonhosted.org/packages/source/f/falcon/falcon-%{version}.tar.gz Source: https://files.pythonhosted.org/packages/source/f/falcon/falcon-%{version}.tar.gz
# github pygments style is not available
Patch0: python-falcon-sphinx-pygments-style.patch
# PATCH-FIX-UPSTREAM Based on gh#falconry/falcon#2216
Patch1: support-new-uvicorn.patch
BuildRequires: %{python_module PyYAML} BuildRequires: %{python_module PyYAML}
BuildRequires: %{python_module Sphinx} BuildRequires: %{python_module Sphinx}
BuildRequires: %{python_module base >= 3.8}
BuildRequires: %{python_module ddt} BuildRequires: %{python_module ddt}
BuildRequires: %{python_module httpx} BuildRequires: %{python_module httpx}
BuildRequires: %{python_module myst-parser >= 2}
BuildRequires: %{python_module pip} BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools} BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module sphinx-design}
BuildRequires: %{python_module sphinx-tabs} BuildRequires: %{python_module sphinx-tabs}
BuildRequires: %{python_module sphinxcontrib-copybutton}
BuildRequires: %{python_module websockets} BuildRequires: %{python_module websockets}
BuildRequires: %{python_module wheel} BuildRequires: %{python_module wheel}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
%if %{with libalternatives}
BuildRequires: alts
Requires: alts
%else
Requires(post): update-alternatives
Requires(postun): update-alternatives
%endif
Suggests: %{name}-doc
BuildArch: noarch
# TODO: Cython support # TODO: Cython support
#BuildRequires: %%{python_module Cython} #BuildRequires: %%{python_module Cython}
#Requires: python-Cython
# SECTION test requirements # SECTION test requirements
BuildRequires: %{python_module aiofiles} BuildRequires: %{python_module aiofiles}
BuildRequires: %{python_module cbor2} BuildRequires: %{python_module cbor2}
@@ -50,16 +72,12 @@ BuildRequires: %{python_module testtools}
%if 0%{?suse_version} >= 1550 %if 0%{?suse_version} >= 1550
BuildRequires: %{python_module httpx if (%python-base without python36-base)} BuildRequires: %{python_module httpx if (%python-base without python36-base)}
BuildRequires: %{python_module uvicorn if (%python-base without python36-base)} BuildRequires: %{python_module uvicorn if (%python-base without python36-base)}
BuildRequires: %{python_module websockets if (%python-base without python36-base)} BuildRequires: %{python_module websockets >= 13.1 if (%python-base without python36-base)}
%endif
%if %{with doc}
BuildRequires: %{python_module pydata-sphinx-theme}
%endif %endif
# /SECTION # /SECTION
BuildRequires: fdupes
BuildRequires: python-rpm-macros
#Requires: python-Cython
Requires(post): update-alternatives
Requires(postun): update-alternatives
Suggests: %{name}-doc
BuildArch: noarch
%python_subpackages %python_subpackages
%package -n %{name}-doc %package -n %{name}-doc
@@ -85,28 +103,38 @@ rm tests/test_media_handlers.py
%build %build
export CFLAGS="%{optflags} -fno-strict-aliasing" export CFLAGS="%{optflags} -fno-strict-aliasing"
%pyproject_wheel %pyproject_wheel
%if %{with doc}
export PYTHONPATH="$(pwd)" export PYTHONPATH="$(pwd)"
pushd docs pushd docs
make html make html
rm _build/html/.buildinfo rm _build/html/.buildinfo
popd popd
%endif
%install %install
%pyproject_install %pyproject_install
%python_clone -a %{buildroot}%{_bindir}/falcon-bench %python_clone -a %{buildroot}%{_bindir}/falcon-bench
%python_clone -a %{buildroot}%{_bindir}/falcon-inspect-app %python_clone -a %{buildroot}%{_bindir}/falcon-inspect-app
%python_clone -a %{buildroot}%{_bindir}/falcon-print-routes %python_clone -a %{buildroot}%{_bindir}/falcon-print-routes
%python_group_libalternatives falcon-bench falcon-inspect-app falcon-print-routes
%python_expand %fdupes %{buildroot}%{$python_sitelib} %python_expand %fdupes %{buildroot}%{$python_sitelib}
%if %{with doc}
mkdir -p %{buildroot}%{_defaultdocdir}/%{name}-doc mkdir -p %{buildroot}%{_defaultdocdir}/%{name}-doc
cp -ar docs/_build/html examples %{buildroot}%{_defaultdocdir}/%{name}-doc/ cp -ar docs/_build/html examples %{buildroot}%{_defaultdocdir}/%{name}-doc/
%fdupes %{buildroot}%{_defaultdocdir}/%{name}-doc/ %fdupes %{buildroot}%{_defaultdocdir}/%{name}-doc/
%endif
%check %check
export LANG=en_US.UTF8 export LANG=en_US.UTF8
%pytest tests %pytest
%pre
%python_libalternatives_reset_alternative falcon-bench
%post %post
%{python_install_alternative falcon-bench falcon-inspect-app falcon-print-routes} %python_install_alternative falcon-bench falcon-inspect-app falcon-print-routes
%postun %postun
%python_uninstall_alternative falcon-bench %python_uninstall_alternative falcon-bench
@@ -120,7 +148,9 @@ export LANG=en_US.UTF8
%{python_sitelib}/falcon %{python_sitelib}/falcon
%{python_sitelib}/falcon-%{version}.dist-info %{python_sitelib}/falcon-%{version}.dist-info
%if %{with doc}
%files -n %{name}-doc %files -n %{name}-doc
%doc %{_defaultdocdir}/%{name}-doc %doc %{_defaultdocdir}/%{name}-doc
%endif
%changelog %changelog

View File

@@ -1,192 +0,0 @@
From 13da50949751de6683b57221c2ab5f1fdce8eb50 Mon Sep 17 00:00:00 2001
From: Vytautas Liuolia <vytautas.liuolia@gmail.com>
Date: Wed, 13 Mar 2024 16:31:00 +0100
Subject: [PATCH 1/7] chore(asyncio): replace `get_event_loop()` ->
`get_running_loop()` where applicable
---
tests/asgi/test_scope.py | 6 +++---
tests/dump_asgi.py | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
Index: falcon-3.1.3/tests/asgi/test_scope.py
===================================================================
--- falcon-3.1.3.orig/tests/asgi/test_scope.py
+++ falcon-3.1.3/tests/asgi/test_scope.py
@@ -70,7 +70,7 @@ def test_supported_asgi_version(version,
resp_event_collector = testing.ASGIResponseEventCollector()
async def task():
- coro = asyncio.get_event_loop().create_task(
+ coro = asyncio.get_running_loop().create_task(
app(scope, req_event_emitter, resp_event_collector)
)
@@ -142,7 +142,7 @@ def test_lifespan_scope_default_version(
scope = {'type': 'lifespan'}
async def t():
- t = asyncio.get_event_loop().create_task(
+ t = asyncio.get_running_loop().create_task(
app(scope, req_event_emitter, resp_event_collector)
)
@@ -196,7 +196,7 @@ def test_lifespan_scope_version(spec_ver
return
async def t():
- t = asyncio.get_event_loop().create_task(
+ t = asyncio.get_running_loop().create_task(
app(scope, req_event_emitter, resp_event_collector)
)
Index: falcon-3.1.3/tests/dump_asgi.py
===================================================================
--- falcon-3.1.3.orig/tests/dump_asgi.py
+++ falcon-3.1.3/tests/dump_asgi.py
@@ -23,5 +23,5 @@ async def app(scope, receive, send):
}
)
- loop = asyncio.get_event_loop()
+ loop = asyncio.get_running_loop()
loop.create_task(_say_hi())
Index: falcon-3.1.3/falcon/util/sync.py
===================================================================
--- falcon-3.1.3.orig/falcon/util/sync.py
+++ falcon-3.1.3/falcon/util/sync.py
@@ -4,7 +4,9 @@ from functools import partial
from functools import wraps
import inspect
import os
+from typing import Awaitable
from typing import Callable
+from typing import TypeVar
__all__ = [
@@ -18,6 +20,42 @@ __all__ = [
]
+Result = TypeVar('Result')
+
+
+class _DummyRunner:
+ def run(self, coro: Awaitable[Result]) -> Result: # pragma: nocover
+ # NOTE(vytas): Work around get_event_loop deprecation in 3.10 by going
+ # via get_event_loop_policy(). This should be equivalent for
+ # async_to_sync's use case as it is currently impossible to invoke
+ # run_until_complete() from a running loop anyway.
+ return self.get_loop().run_until_complete(coro)
+
+ def get_loop(self) -> asyncio.AbstractEventLoop: # pragma: nocover
+ return asyncio.get_event_loop_policy().get_event_loop()
+
+ def close(self) -> None: # pragma: nocover
+ pass
+
+
+class _ActiveRunner:
+ def __init__(self, runner_cls: type):
+ self._runner_cls = runner_cls
+ self._runner = runner_cls()
+
+ # TODO(vytas): This typing is wrong on py311+, but mypy accepts it.
+ # It doesn't, OTOH, accept any of my ostensibly valid attempts to
+ # describe it.
+ def __call__(self) -> _DummyRunner:
+ # NOTE(vytas): Sometimes our runner's loop can get picked and consumed
+ # by other utilities and test methods. If that happens, recreate the runner.
+ if self._runner.get_loop().is_closed():
+ # NOTE(vytas): This condition is never hit on _DummyRunner.
+ self._runner = self._runner_cls() # pragma: nocover
+ return self._runner
+
+
+_active_runner = _ActiveRunner(getattr(asyncio, 'Runner', _DummyRunner))
_one_thread_to_rule_them_all = ThreadPoolExecutor(max_workers=1)
@@ -207,8 +245,13 @@ def async_to_sync(coroutine, *args, **kw
one will be created.
Warning:
- This method is very inefficient and is intended primarily for testing
- and prototyping.
+ Executing async code in this manner is inefficient since it involves
+ synchronization via threading primitives, and is intended primarily for
+ testing, prototyping or compatibility purposes.
+
+ Note:
+ On Python 3.11+, this function leverages a module-wide
+ ``asyncio.Runner``.
Args:
coroutine: A coroutine function to invoke.
@@ -217,17 +260,7 @@ def async_to_sync(coroutine, *args, **kw
Keyword Args:
**kwargs: Additional args are passed through to the coroutine function.
"""
-
- # TODO(vytas): The canonical way of doing this for simple use cases is
- # asyncio.run(), but that would be a breaking change wrt the above
- # documented behaviour; breaking enough to break some of our own tests.
-
- # NOTE(vytas): Work around get_event_loop deprecation in 3.10 by going via
- # get_event_loop_policy(). This should be equivalent for async_to_sync's
- # use case as it is currently impossible to invoke run_until_complete()
- # from a running loop anyway.
- loop = asyncio.get_event_loop_policy().get_event_loop()
- return loop.run_until_complete(coroutine(*args, **kwargs))
+ return _active_runner().run(coroutine(*args, **kwargs))
def runs_sync(coroutine):
Index: falcon-3.1.3/pyproject.toml
===================================================================
--- falcon-3.1.3.orig/pyproject.toml
+++ falcon-3.1.3/pyproject.toml
@@ -63,7 +63,6 @@ filterwarnings = [
"ignore:.cgi. is deprecated and slated for removal:DeprecationWarning",
"ignore:path is deprecated\\. Use files\\(\\) instead:DeprecationWarning",
"ignore:This process \\(.+\\) is multi-threaded",
- "ignore:There is no current event loop",
]
testpaths = [
"tests"
Index: falcon-3.1.3/tests/asgi/test_asgi_servers.py
===================================================================
--- falcon-3.1.3.orig/tests/asgi/test_asgi_servers.py
+++ falcon-3.1.3/tests/asgi/test_asgi_servers.py
@@ -4,6 +4,7 @@ import hashlib
import os
import platform
import random
+import signal
import subprocess
import sys
import time
@@ -27,7 +28,9 @@ _WIN32 = sys.platform.startswith('win')
_SERVER_HOST = '127.0.0.1'
_SIZE_1_KB = 1024
_SIZE_1_MB = _SIZE_1_KB**2
-
+# NOTE(vytas): Windows specific: {Application Exit by CTRL+C}.
+# The application terminated as a result of a CTRL+C.
+_STATUS_CONTROL_C_EXIT = 0xC000013A
_REQUEST_TIMEOUT = 10
@@ -610,7 +613,10 @@ def server_base_url(request):
yield base_url
- assert server.returncode == 0
+ # NOTE(vytas): Starting with 0.29.0, Uvicorn will propagate signal
+ # values into the return code (which is a good practice in Unix);
+ # see also https://github.com/encode/uvicorn/pull/1600
+ assert server.returncode in (0, -signal.SIGTERM, _STATUS_CONTROL_C_EXIT)
break