Skip to content

Commit ad00923

Browse files
authored
Merge branch 'master' into fix/deprecate-testtools-testcase-2156
2 parents 877ef0a + 9902b95 commit ad00923

14 files changed

Lines changed: 170 additions & 12 deletions

File tree

.github/workflows/cibuildwheel.yaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ jobs:
165165
- cp312
166166
- cp313
167167
- cp314
168+
- cp315
168169
include:
169170
- platform:
170171
name: manylinux_x86_64
@@ -182,6 +183,22 @@ jobs:
182183
name: musllinux_aarch64
183184
os: ubuntu-24.04-arm
184185
python: cp314t
186+
- platform:
187+
name: manylinux_x86_64
188+
os: ubuntu-latest
189+
python: cp315t
190+
- platform:
191+
name: musllinux_x86_64
192+
os: ubuntu-latest
193+
python: cp315t
194+
- platform:
195+
name: manylinux_aarch64
196+
os: ubuntu-24.04-arm
197+
python: cp315t
198+
- platform:
199+
name: musllinux_aarch64
200+
os: ubuntu-24.04-arm
201+
python: cp315t
185202

186203
defaults:
187204
run:
@@ -201,7 +218,7 @@ jobs:
201218
platforms: all
202219

203220
- name: Build wheels
204-
uses: pypa/cibuildwheel@f03ac7617d6cff873ccf24cc0d567ef5ba5a9e6d # v4.0.0
221+
uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0
205222
env:
206223
# NOTE(vytas): Uncomment to test against alpha/beta CPython
207224
# (usually May-July until rc1).

.github/workflows/test-wheels.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
platform:
21-
- build: "cp314-manylinux_aarch64"
21+
- build: "cp315-manylinux_aarch64"
2222
os: ubuntu-24.04-arm
2323
- build: "cp314-manylinux_s390x"
2424
os: ubuntu-latest
@@ -46,11 +46,11 @@ jobs:
4646
platforms: all
4747

4848
- name: Build wheels
49-
uses: pypa/cibuildwheel@f03ac7617d6cff873ccf24cc0d567ef5ba5a9e6d # v4.0.0
49+
uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55 # v4.1.0
5050
env:
5151
# NOTE(vytas): Uncomment to test against alpha/beta CPython
5252
# (usually May-July until rc1).
53-
# CIBW_ENABLE: cpython-prerelease
53+
CIBW_ENABLE: cpython-prerelease
5454

5555
CIBW_ARCHS_LINUX: all
5656
CIBW_BUILD: ${{ matrix.platform.build }}

.github/workflows/tests.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ jobs:
6565
- env: py314_cython
6666
python-version: "3.14"
6767
- env: py315
68-
python-version: "3.15.0-alpha.3 - 3.15.0"
68+
python-version: "3.15.0-beta.3 - 3.15.0"
69+
- env: py315_cython
70+
python-version: "3.15.0-beta.3 - 3.15.0"
6971
- env: py312_nocover
7072
os: macos-latest
7173
platform-label: ' (macos)'

.github/workflows/tox-sdist.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jobs:
2222
- "3.12"
2323
- "3.13"
2424
- "3.14"
25+
- "3.15"
2526

2627
steps:
2728
- name: Checkout repo
@@ -33,7 +34,7 @@ jobs:
3334
- name: Set up Python
3435
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
3536
with:
36-
python-version: ${{ matrix.python-version }}
37+
python-version: ${{ matrix.python-version != '3.15' && matrix.python-version || '3.15.0-beta.3 - 3.15.0'}}
3738

3839
- name: Install dependencies
3940
run: |

AGENTS.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Falcon Agent Guide
2+
3+
Read `CONTRIBUTING.md` first. Treat `pyproject.toml` and `tox.ini` as the
4+
executable source of truth when prose and configuration differ. In accordance
5+
with the “Use of LLMs” policy in `CONTRIBUTING.md`, carefully review and test
6+
all generated changes.
7+
8+
## Repository map
9+
10+
- `falcon/app.py`, `falcon/request.py`, and `falcon/response.py` implement the
11+
WSGI side. `falcon/asgi/` implements ASGI and WebSocket behavior. Shared
12+
behavior lives in modules such as `falcon/app_helpers.py`, `falcon/routing/`,
13+
`falcon/media/`, and `falcon/util/`.
14+
- `falcon/testing/` contains public test helpers. Primary tests live in
15+
`tests/`, with ASGI-specific coverage in `tests/asgi/`. Tutorial and example
16+
suites have dedicated tox environments.
17+
- `falcon/cyutil/*.pyx` contains optional optimized implementations selected by
18+
Python fallbacks such as `falcon/util/reader.py` and `falcon/util/uri.py`.
19+
Preserve both modes when changing these paths, and use a Cython tox
20+
environment.
21+
- Documentation is reStructuredText under `docs/`. Put runnable recipe snippets
22+
in `examples/recipes/`; documentation includes them with `literalinclude`.
23+
24+
## Change rules
25+
26+
- Keep patches narrow. Preserve Falcon's public API compatibility, HTTP/RFC
27+
correctness, and Python 3.9+ support on CPython and PyPy unless the task
28+
explicitly changes those contracts.
29+
- Check both WSGI and ASGI surfaces when shared request, response, routing,
30+
middleware, media, error, or testing behavior changes. Add or update the
31+
corresponding tests; do not assume inheritance makes behavior identical.
32+
- Maintain 100% branch coverage for changed behavior, including error and
33+
version-specific paths. Do not add production dependencies casually;
34+
`[project].dependencies` is currently empty.
35+
- Treat request and response hot paths as performance-sensitive. Reuse existing
36+
helpers. When throughput or allocation behavior could change, benchmark with
37+
`tox -e py310_bench -- <falcon-bench args>`.
38+
- Do not bulk-modernize `%` formatting in `falcon/`. `pyproject.toml`
39+
deliberately ignores Ruff's `UP030`, `UP031`, and `UP032` there pending
40+
inspection and benchmarks.
41+
42+
## Style
43+
44+
- Ruff targets Python 3.9, 88 columns, and single quotes.
45+
- Public classes, attributes, methods, and functions require
46+
Napoleon/Google-style docstrings. Start immediately after the opening quotes
47+
with a roughly 70-character summary that ends in a period.
48+
- Name caught exceptions `ex`. Limit single-character names to trivial indices
49+
and standard formulas.
50+
- Format necessary non-trivial tagged comments as
51+
`TODO|NOTE|PERF|APPSEC(<GitHub handle>):`. If the author's handle is
52+
unavailable, do not invent one and don't impersonate other users;
53+
avoid the tagged comment unless necessary.
54+
55+
## Verification
56+
57+
Run commands from the repository root. Start with the focused test, run only
58+
affected specialized environments next, and reserve the complete `tox` gate
59+
for broad or final validation.
60+
61+
- In an already-prepared development environment, get focused feedback with
62+
`pytest tests/test_<area>.py -k '<case>'` or
63+
`pytest tests/asgi/test_<area>.py -k '<case>'`.
64+
- Run all Python tests and collect coverage data with `tox -e pytest`; check
65+
minimum-dependency compatibility with `tox -e mintest`; verify optional
66+
Cython behavior with a matching environment such as `tox -e py312_cython`.
67+
- Check formatting and lint with `tox -e ruff,pep8,pep8-docstrings`. Apply
68+
formatting and safe fixes only with `tox -e reformat`.
69+
- For typing changes, run `tox -e mypy,mypy_tests`. For documentation or
70+
docstring changes, run `tox -e docs`.
71+
- Run `tox` for the complete local gate and 100% combined coverage report.
72+
73+
## Documentation and changelog
74+
75+
- Update user and API documentation when behavior or public contracts change;
76+
build it with `tox -e docs`.
77+
- Functionality changes require
78+
`docs/_newsfragments/{issue_number}.{fragment_type}.rst`. The exact fragment
79+
types are `breakingchange`, `newandimproved`, `bugfix`, and `misc`. Preview
80+
the result with `tox -e changelog_draft`.
81+
- Never invent an issue or PR number. If none is available, report that the
82+
fragment cannot be named instead of creating a placeholder.
83+
- For recipes, put executable code in `examples/recipes/`, include it from
84+
`docs/user/recipes/`, and add coverage in `tests/test_recipes.py` when
85+
practical.
86+
87+
## Operator boundaries
88+
89+
- Never create, submit, or open a GitHub pull request. Prepare the changes and
90+
verification evidence, then ask the human operator to open the pull request.
91+
- Never tick, check, or otherwise complete a pull request checklist on the
92+
operator's behalf. The human operator must review the changes and complete
93+
every checklist item manually.
94+
95+
See `CONTRIBUTING.md` for commit-message format, full docstring markup rules,
96+
review policy, and contributor conduct.

AUTHORS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ listed below by date of first contribution:
233233
* Matt Van Horn (mvanhorn)
234234
* Apoorva Verma (apoorva-01)
235235
* max (maxtaran2010)
236+
* Johannes Rueschel (chbndrhnns)
237+
* Gaurav Yadav (MeGaurav4)
236238

237239
(et al.)
238240

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@AGENTS.md

CONTRIBUTING.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,20 @@ $ tox -e reformat
4646
```
4747

4848
You can check all this by running ``tox`` from within the Falcon project directory.
49-
Your environment must be based on CPython 3.10, 3.11, 3.12, 3.13, or 3.14:
49+
Your environment must be based on CPython 3.10, 3.11, 3.12, 3.13, 3.14, or 3.15:
5050

5151
```bash
5252
$ pip install -U tox
5353
$ tox --recreate
5454
```
5555

56+
If you prefer, you can also use [`uvx`](https://docs.astral.sh/uv/) to run
57+
``ruff`` and ``tox`` directly:
58+
59+
```bash
60+
$ uvx tox -e reformat # also applies to other examples, e.g., uvx tox --recreate
61+
```
62+
5663
### Reviews
5764

5865
Falcon is used in a number of mission-critical applications and is known for its stability and reliability. Therefore, we invest a lot of time in carefully reviewing PRs and working with contributors to ensure that every patch merged into the master branch is correct, complete, performant, well-documented, and appropriate.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
The default OPTIONS responder no longer emits an Allow header when no HTTP methods are explicitly mapped to the endpoint via the @on_get, @on_post, etc. decorators. The header previously listed the empty set of allowed methods as an empty string, which violated RFC 7231.

docs/changes/4.4.0.rst

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ Falcon 4.4 is in development. The progress is tracked via the
99
on GitHub.
1010

1111

12-
.. Changes to Supported Platforms
13-
.. ------------------------------
12+
Changes to Supported Platforms
13+
------------------------------
1414

15-
.. NOTE(vytas): No changes to the supported platforms (yet).
15+
- CPython 3.15 is now fully supported.
16+
(`#2593 <https://github.com/falconry/falcon/issues/2593>`__)
1617

1718

1819
.. towncrier release notes start
@@ -23,5 +24,8 @@ Contributors to this Release
2324
Many thanks to all of our talented and stylish contributors for this release!
2425

2526
- `apoorva-01 <https://github.com/apoorva-01>`__
27+
- `chbndrhnns <https://github.com/chbndrhnns>`__
2628
- `maxtaran2010 <https://github.com/maxtaran2010>`__
29+
- `MeGaurav4 <https://github.com/MeGaurav4>`__
30+
- `mvanhorn <https://github.com/mvanhorn>`__
2731
- `vytas7 <https://github.com/vytas7>`__

0 commit comments

Comments
 (0)