Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,16 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13']
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
include:
- os: macos-latest
python-version: '3.13'
- os: macos-latest
python-version: '3.14'
- os: windows-latest
python-version: '3.13'
- os: windows-latest
python-version: '3.14'
runs-on: ${{ matrix.os }}
name: test (py${{ matrix.python-version }} ${{ matrix.os }})
steps:
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ The app mode determines how Connect runs the content. Manifests must specify the

### CI/CD
- GitHub Actions workflow in `.github/workflows/main.yml`
- Tests run on Python 3.8-3.13 across ubuntu/macos/windows
- Tests run on Python 3.8-3.14 across ubuntu/macos/windows
- Linting enforced on all PRs
- Coverage reported on Python 3.8 PRs

Expand Down
2 changes: 1 addition & 1 deletion Justfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# rsconnect-python task runner. Run `just --list` to see recipes.

python_versions := "3.8 3.9 3.10 3.11 3.12 3.13"
python_versions := "3.8 3.9 3.10 3.11 3.12 3.13 3.14"

# Run the test suite against a single Python version (default 3.13)
# Invoke via `bash` so the recipe works on Windows, where uv cannot spawn the
Expand Down
23 changes: 23 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import os
import ssl
import sys

from os.path import abspath, dirname

import httpretty.core


HERE = dirname(abspath(__file__))
sys.path.insert(0, HERE)
Expand All @@ -12,3 +15,23 @@
# default argument value at import time, so this must be set before any test
# module imports rsconnect. (Previously injected by the Makefile's TEST_ENV.)
os.environ.setdefault("CONNECT_CONTENT_BUILD_DIR", "rsconnect-build-test")


# httpretty (1.1.4, released 2021) mocks TLS with
# `ssl.SSLContext.wrap_socket = functools.partial(fake_wrap_socket, ...)`.
# Python 3.14 made partial objects descriptors, so that class attribute now binds
# the SSLContext as the first positional argument and httpretty mistakes it for
# the socket. Drop the extra argument. The isinstance check makes this a no-op on
# Python 3.13 and earlier, and also once httpretty ships the fix in
# gabrielfalcao/HTTPretty#488. Tracked by #833, which proposes replacing
# httpretty with mocket so this shim can go away.
_httpretty_fake_wrap_socket = httpretty.core.fake_wrap_socket


def _fake_wrap_socket(orig_wrap_socket_fn, *args, **kw):
if args and isinstance(args[0], ssl.SSLContext):
args = args[1:]
return _httpretty_fake_wrap_socket(orig_wrap_socket_fn, *args, **kw)


httpretty.core.fake_wrap_socket = _fake_wrap_socket
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## Unreleased

- Added support for Python 3.14. The test suite now runs on Python 3.14 in CI.
- `rsconnect deploy` subcommands now accept `--quiet`, which suppresses the
step-by-step progress lines and the streamed server build log, printing only
the deployed content URL to stdout so it can be captured with
Expand Down
Loading