Contributing to rsconnect-python
July 16, 2026 ยท View on GitHub
This project aims to uphold Python community norms and make use of recommended tooling.
To get started, you'll want to:
- install
uvandjust - clone the repo
- run
uv sync --group testto provision the interpreter and install all dependencies - validate your build environment with some sample commands
We use uv to manage environments and
just as the task runner. Install both, then:
# Clone the repo
cd ~/dev
git clone https://github.com/posit-dev/rsconnect-python.git
cd rsconnect-python
# Create the environment and install the project plus dev tooling.
# `uv` provisions the interpreter and resolves the `test` dependency group.
uv sync --group test
# Run the CLI from your working tree:
uv run rsconnect version
Workflow
Linting
just lint
This runs ruff format --check, ruff check, and pyright. pyright is
advisory (it does not fail the command); ruff is enforced. Auto-format and
apply fixes with:
just fmt
Testing
# run the tests on the default Python (3.13)
just test
# run tests with a specific Python version (uv fetches it if needed)
just test 3.12
# run tests across all supported Python versions
just all-tests
The test suite includes integration tests that require a running Posit Connect
server. These tests are skipped automatically unless the CONNECT_SERVER and
CONNECT_API_KEY environment variables are set. If you have these variables in
your environment from other work and see unexpected test failures, unset them:
unset CONNECT_SERVER CONNECT_API_KEY
Proposing Change
Any and all proposed changes are expected to be made via pull request.
Testing Against Connect
Prior to merging, we run tests against the dev version of Connect using the rsconnect-python-tests-at-night workflow
in the Connect repository. To test a feature branch:
- Navigate to the
rsconnect-python-tests-at-nightworkflow in the Connect repository - Trigger it manually via workflow_dispatch
- Specify your
rsconnect-pythonbranch/ref in the dropdown
Versioning and Releasing
The version is a static field in pyproject.toml, managed with
uv version.
main always carries a .dev version (e.g. 1.29.1.dev0) so development
builds are marked as pre-releases and never collide with a published release.
main is a protected branch, so direct pushes are rejected. Releases go
through a Release PR; only the tag is pushed directly (tags are not
protected).
Open the Release PR
Increment the version and update CHANGELOG.md. The changelog must be updated before EACH release, even beta releases.
# Drop the .dev suffix to cut the release (e.g. 1.29.1.dev0 -> 1.29.1)
VERSION="$(uv version --bump stable --dry-run --short)" # use "--bump minor" if there are new features
git checkout -b "release-$VERSION" main
uv version "$VERSION"
sed -i "s/^## Unreleased/## [$VERSION] - $(date +%Y-%m-%d)/" docs/CHANGELOG.md
git commit -am "Release $VERSION"
git push -u origin "release-$VERSION"
gh pr create --title "Release $VERSION" --body "Release $VERSION"
Merge the Release PR, then Tag main
After the PR is approved and merged, tag the merge commit on main.
Do NOT tag your local release branch: squash-merging rewrites the SHA.
git checkout main && git pull
VERSION="$(uv version --short)" # sanity check: must be the release version
git tag -a "$VERSION" -m "Release $VERSION"
git push origin "$VERSION"
On the tag push, the distributions job asserts the tag equals the
pyproject.toml version, builds rsconnect_python and rsconnect, and
publishes to PyPI and the
GitHub releases page.
Re-arm development
After releasing, re-arm development on main with a second PR that adds
back the Unreleased section to CHANGELOG.md and moves to a development
version
VERSION="$(uv version --bump patch --bump dev --dry-run --short)" # e.g. 1.29.1 -> 1.29.2.dev1
git checkout -b "rearm-$VERSION" main
sed -i '0,/^## \[/s//## Unreleased\n\n&/' docs/CHANGELOG.md
uv version "$VERSION"
git commit -am "Begin $VERSION development"
git push -u origin "rearm-$VERSION"
gh pr create --title "Begin $VERSION development" --body "Re-arm development after release"
NOTE: Pre-release versions must comply with PEP 440 so PyPI marks them as pre-releases.
uv version'sdev/alpha/beta/rcbumps produce compliant strings.
Updating rsconnect-python on conda-forge
rsconnect-python exists on conda-forge as its own feedstock
Updating the package requires a fork of the repository and a push request.
-
For new version/release, update the meta.yaml file with the new version number, source url, and corresponding checksum.
-
For a rebuild of the same version, increase "number" under "build" by one in the meta.yaml file.
Once the proposed change is pushed, follow the checklist.
Adding yourself as a rsconnect-python conda-forge maintainer
Add your github username under recipe-maintainers in the meta.yaml file.