From b514721f74b03fb9cbcaf3be482b18037fe75b15 Mon Sep 17 00:00:00 2001 From: Fernando Macedo Date: Mon, 12 Oct 2026 12:23:51 -0300 Subject: [PATCH] chore: adopt trunk based development on main Drop the git-flow model: main is the only long-lived branch, releases are tags on main and hotfixes come from release/X.Y.x branches cut from the released tag. Point CI, badges, docs links and the contributing guide at main and remove the Sonar-era 'git fetch origin develop' step. Signed-off-by: Fernando Macedo --- .github/workflows/pages.yml | 2 +- .github/workflows/python-package.yml | 5 +- .github/workflows/release.yml | 2 - AGENTS.md | 6 +- README.md | 8 +- docs/conf.py | 4 +- docs/contributing.md | 111 ++++++++++------- docs/installation.md | 2 +- uv.lock | 172 ++++++++++++++------------- 9 files changed, 166 insertions(+), 146 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 35912b19..6979da49 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -6,7 +6,7 @@ name: pages on: push: - branches: [develop] + branches: [main] paths: - statemachine/io/schemas/statechart.schema.json - .github/workflows/pages.yml diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 6f6dfe0c..c834215a 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,9 +5,9 @@ name: Python checks on: push: - branches: [ "develop" ] + branches: [ "main", "release/**" ] pull_request: - branches: [ "develop" ] + branches: [ "main" ] permissions: contents: read @@ -22,7 +22,6 @@ jobs: steps: - uses: actions/checkout@v7 - - run: git fetch origin develop - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v7 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c571da18..10d8c899 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,8 +13,6 @@ jobs: steps: - uses: actions/checkout@v7 - - run: git fetch origin develop - - name: Setup Python uses: actions/setup-python@v7 with: diff --git a/AGENTS.md b/AGENTS.md index fc4db48a..12450a24 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -303,9 +303,9 @@ enforced, so when you add or change native vocabulary: ## Git workflow -- Main branch: `develop` -- PRs target `develop` -- Releases are tagged as `v*.*.*` +- Trunk based development: `main` is the only long-lived branch, PRs target `main` +- Releases are tags `vX.Y.Z` on `main`; the `latest` tag moves to every release +- Hotfixes: `release/X.Y.x` branch cut from the tag, fixes cherry-picked from `main` - Signed commits preferred (`git commit -s`) - Use [Conventional Commits](https://www.conventionalcommits.org/) messages (e.g., `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`, `perf:`) diff --git a/README.md b/README.md index cbde0bcb..a8242a55 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,15 @@ [![pypi](https://img.shields.io/pypi/v/python-statemachine.svg)](https://pypi.python.org/pypi/python-statemachine) [![downloads total](https://static.pepy.tech/badge/python-statemachine)](https://pepy.tech/project/python-statemachine) [![downloads](https://img.shields.io/pypi/dm/python-statemachine.svg)](https://pypi.python.org/pypi/python-statemachine) -[![Coverage report](https://codecov.io/gh/fgmacedo/python-statemachine/branch/develop/graph/badge.svg)](https://codecov.io/gh/fgmacedo/python-statemachine) +[![Coverage report](https://codecov.io/gh/fgmacedo/python-statemachine/branch/main/graph/badge.svg)](https://codecov.io/gh/fgmacedo/python-statemachine) [![Documentation Status](https://readthedocs.org/projects/python-statemachine/badge/?version=latest)](https://python-statemachine.readthedocs.io/en/latest/?badge=latest) -[![GitHub commits since last release (main)](https://img.shields.io/github/commits-since/fgmacedo/python-statemachine/main/develop)](https://github.com/fgmacedo/python-statemachine/compare/main...develop) +[![GitHub commits since last release](https://img.shields.io/github/commits-since/fgmacedo/python-statemachine/latest?sort=semver)](https://github.com/fgmacedo/python-statemachine/compare/latest...main) Expressive [statecharts](https://statecharts.dev/) and [FSMs](https://en.wikipedia.org/wiki/Finite-state_machine) for modern Python.
-![](https://github.com/fgmacedo/python-statemachine/blob/develop/docs/images/python-statemachine.png?raw=true) +![](https://github.com/fgmacedo/python-statemachine/blob/main/docs/images/python-statemachine.png?raw=true)
@@ -94,7 +94,7 @@ Generate a diagram or get a text representation with f-strings: sm._graph().write_png("traffic_light.png") ``` -![](https://raw.githubusercontent.com/fgmacedo/python-statemachine/develop/docs/images/readme_trafficlightmachine.png) +![](https://raw.githubusercontent.com/fgmacedo/python-statemachine/main/docs/images/readme_trafficlightmachine.png) Parameters are injected into callbacks automatically — the library inspects the signature and provides only the arguments each callback needs: diff --git a/docs/conf.py b/docs/conf.py index 59e518b5..f3999bf0 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -174,7 +174,7 @@ "navigation_with_keys": True, "top_of_page_buttons": ["view", "edit"], "source_repository": "https://github.com/fgmacedo/python-statemachine/", - # "source_branch": "develop", + # "source_branch": "main", "source_directory": "docs/", } @@ -271,7 +271,7 @@ "display_github": True, # Integrate GitHub "github_user": "fgmacedo", # Username "github_repo": "python-statemachine", # Repo name - "github_version": "develop", # Version + "github_version": "main", # Version "conf_py_path": "/docs/", # Path in the checkout to the docs root } diff --git a/docs/contributing.md b/docs/contributing.md index e9137887..b8844b89 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -104,9 +104,11 @@ Ready to contribute? Here's how to set up `python-statemachine` for local develo pre-commit install -3. Create a branch for local development: +3. Create a branch for local development, starting from an up-to-date `main`: - git checkout -b + git switch main + git pull --ff-only origin main + git switch -c 4. Make changes to the code. @@ -144,8 +146,9 @@ Ready to contribute? Here's how to set up `python-statemachine` for local develo git commit -s -m "Your detailed description of your changes." git push origin name-of-your-bugfix-or-feature -1. Create a pull request on the original repository for your changes to be reviewed and potentially -merged. Be sure to follow the project's code of conduct and contributing guidelines. +1. Create a pull request on the original repository, targeting the `main` branch, for your +changes to be reviewed and potentially merged. Be sure to follow the project's code of conduct +and contributing guidelines. 1. Use `exit` to leave the virtual environment. @@ -162,44 +165,34 @@ Before you submit a pull request, check that it meets these guidelines: ## Releasing a New Version -This project uses [git-flow](https://github.com/nvie/gitflow) for release management and -publishes to PyPI automatically via GitHub Actions when a version tag is pushed. +This project follows [trunk based development](https://trunkbaseddevelopment.com/): `main` is +the only long-lived branch and every release is a tag on it. Pushing a `vX.Y.Z` tag triggers +the GitHub Actions workflow that publishes to PyPI. ### Prerequisites -- You must be on the `develop` branch with a clean working tree. -- `git-flow` must be installed and initialized: +- You must be on the `main` branch with a clean working tree, up to date with `origin/main`: ```shell - brew install git-flow # macOS - git flow init # use main for production, develop for next release + git switch main + git pull --ff-only origin main ``` -- All changes intended for the release must already be merged into `develop`. +- All changes intended for the release must already be merged into `main`. ### Step-by-step release process The following steps use version `X.Y.Z` as a placeholder. Replace it with the actual version number (e.g., `2.6.0`). -#### 1. Start the release branch - -```shell -git checkout develop -git pull origin develop -git flow release start X.Y.Z -``` - -This creates and switches to a `release/X.Y.Z` branch based on `develop`. - -#### 2. Bump the version number +#### 1. Bump the version number Update the version string in **both** files: - `pyproject.toml` — the `version` field under `[project]` - `statemachine/__init__.py` — the `__version__` variable -#### 3. Update translations +#### 2. Update translations Extract new translatable strings, merge them into all existing `.po` files, translate the new entries, and compile: @@ -218,7 +211,7 @@ language (error messages will appear translated instead of in English). Delete t verifying translations work: `rm -f statemachine/locale/*/LC_MESSAGES/statemachine.mo` ``` -#### 4. Write release notes +#### 3. Write release notes Create `docs/releases/X.Y.Z.md` documenting all changes since the previous release. Include sections for new features, bugfixes, performance improvements, and miscellaneous changes. @@ -230,7 +223,7 @@ major version section). Update any related documentation pages (e.g., if a bugfix adds a new behavior that users should know about). -#### 5. Run linters and tests +#### 4. Run linters and tests ```shell uv run ruff check . @@ -241,7 +234,7 @@ uv run pytest -n auto All checks must pass before committing. -#### 6. Commit +#### 5. Commit Stage all changed files and commit. The pre-commit hooks will run ruff, mypy, and pytest automatically. @@ -251,33 +244,25 @@ git add git commit -m "chore: prepare release X.Y.Z" ``` -#### 7. Finish the release - -```shell -git flow release finish X.Y.Z -m "vX.Y.Z" -``` +#### 6. Tag the release -This will: -- Merge `release/X.Y.Z` into `main` -- Create an annotated tag `X.Y.Z` on `main` -- Merge `main` back into `develop` -- Delete the `release/X.Y.Z` branch +Create an annotated `vX.Y.Z` tag and move the `latest` tag to the same commit: -```{note} -If tagging fails (e.g., GPG or editor issues), create the tag manually and re-run: -`git tag -a X.Y.Z -m "vX.Y.Z"` then `git flow release finish X.Y.Z -m "vX.Y.Z"`. +```shell +git tag -a vX.Y.Z -m "vX.Y.Z" +git tag -f latest ``` -#### 8. Update the `latest` tag and push +#### 7. Push ```shell -git tag latest -f -git push origin main develop --tags -f +git push origin main vX.Y.Z +git push -f origin latest ``` -Force-pushing tags is needed to move the `latest` tag. +Force-pushing is needed only to move the `latest` tag. -#### 9. Verify the release +#### 8. Verify the release The tag push triggers the `release` GitHub Actions workflow (`.github/workflows/release.yml`), which will: @@ -290,7 +275,7 @@ which will: Monitor the workflow run at `https://github.com/fgmacedo/python-statemachine/actions` to confirm the release was published successfully. -#### 10. Publish the GitHub release +#### 9. Publish the GitHub release Create the GitHub release from the freshly pushed tag using the release notes file as the body. Two adjustments are needed when going from MyST/Sphinx markdown to GitHub-flavored @@ -312,9 +297,43 @@ Then create the release. Use the converted notes as the body: gh release create vX.Y.Z \ --title "vX.Y.Z" \ --notes-file /tmp/release-X.Y.Z-notes.md \ - --target main \ --verify-tag ``` Confirm the rendered release at `https://github.com/fgmacedo/python-statemachine/releases/tag/vX.Y.Z`. + +### Hotfix releases + +Use a hotfix release when `main` already has unreleased changes that must not ship yet, but a +fix needs to reach users of the last release. If `main` is releasable as is, just cut a +regular release from it. + +1. Land the fix on `main` first, through a regular pull request with tests. + +1. Create the release branch from the released tag (or reuse it if it already exists): + + git switch -c release/X.Y.x vX.Y.Z + +1. Cherry-pick the fix commits from `main`, keeping a reference to their origin: + + git cherry-pick -x + +1. On the release branch, bump the patch version and write the release notes, then commit + `chore: prepare release X.Y.Z` exactly as in the regular process. + +1. Tag and push. Pushing the branch runs the `Python checks` workflow before you tag; move + `latest` only if this is the highest version released so far: + + git push -u origin release/X.Y.x + git tag -a vX.Y.Z -m "vX.Y.Z" + git push origin vX.Y.Z + git tag -f latest && git push -f origin latest + +1. Publish the GitHub release as in the regular process. + +1. Cherry-pick the `chore: prepare release X.Y.Z` commit back into `main` so the version and + release notes stay in sync. A conflict only happens if `main` was already bumped; keep + `main`'s version and take the release notes. + +The release branch can be deleted once the tag exists; the tag keeps the commits reachable. diff --git a/docs/installation.md b/docs/installation.md index 8d08ab2d..e5069b1c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -45,7 +45,7 @@ The sources for Python State Machine can be downloaded from the [Github repo](ht You can either clone the public repository: ```shell -git clone git://github.com/fgmacedo/python-statemachine +git clone https://github.com/fgmacedo/python-statemachine.git ``` Or download the `tarball`: diff --git a/uv.lock b/uv.lock index 2c0969e5..2a258f07 100644 --- a/uv.lock +++ b/uv.lock @@ -8,6 +8,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] +[options] +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer-span = "P7D" + [[package]] name = "accessible-pygments" version = "0.0.5" @@ -509,9 +513,9 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "asgiref", marker = "python_full_version < '3.12'" }, - { name = "sqlparse", marker = "python_full_version < '3.12'" }, - { name = "tzdata", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/d8/43e9d000519adceb189620b6869ff88031e046df91c2e9da72f8f6918399/django-5.2.17.tar.gz", hash = "sha256:9d4d93be539a18ab80d058eb515900e10951e04c537c5a6b394fc49528d3251f", size = 10889740, upload-time = "2026-08-04T15:04:03.173Z" } wheels = [ @@ -527,9 +531,9 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.15'", ] dependencies = [ - { name = "asgiref", marker = "python_full_version >= '3.12'" }, - { name = "sqlparse", marker = "python_full_version >= '3.12'" }, - { name = "tzdata", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/d4/8314b5bdef20832f0ac6ae3b3e4d4924e4759fa3b4af27609dd747e7a6be/django-6.1.1.tar.gz", hash = "sha256:7ab93536d8e677aa14554c56426290c69480bf2ee68d7513d4a22f57d6bfeb84", size = 11284905, upload-time = "2026-09-02T17:20:45.621Z" } wheels = [ @@ -567,7 +571,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -833,7 +837,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version < '3.11'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ @@ -850,7 +854,7 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "mdurl", marker = "python_full_version >= '3.11'" }, + { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ @@ -1048,12 +1052,12 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "jinja2", marker = "python_full_version < '3.11'" }, - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "mdit-py-plugins", marker = "python_full_version < '3.11'" }, - { name = "pyyaml", marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ @@ -1070,12 +1074,12 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "mdit-py-plugins", marker = "python_full_version >= '3.11'" }, - { name = "pyyaml", marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "jinja2" }, + { name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" } }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } @@ -1964,23 +1968,23 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version < '3.11'" }, - { name = "babel", marker = "python_full_version < '3.11'" }, - { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "imagesize", marker = "python_full_version < '3.11'" }, - { name = "jinja2", marker = "python_full_version < '3.11'" }, - { name = "packaging", marker = "python_full_version < '3.11'" }, - { name = "pygments", marker = "python_full_version < '3.11'" }, - { name = "requests", marker = "python_full_version < '3.11'" }, - { name = "snowballstemmer", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.11'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.11'" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ @@ -1995,23 +1999,23 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version == '3.11.*'" }, - { name = "babel", marker = "python_full_version == '3.11.*'" }, - { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "imagesize", marker = "python_full_version == '3.11.*'" }, - { name = "jinja2", marker = "python_full_version == '3.11.*'" }, - { name = "packaging", marker = "python_full_version == '3.11.*'" }, - { name = "pygments", marker = "python_full_version == '3.11.*'" }, - { name = "requests", marker = "python_full_version == '3.11.*'" }, - { name = "roman-numerals", marker = "python_full_version == '3.11.*'" }, - { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ @@ -2027,23 +2031,23 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.15'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version >= '3.12'" }, - { name = "babel", marker = "python_full_version >= '3.12'" }, - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "imagesize", marker = "python_full_version >= '3.12'" }, - { name = "jinja2", marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, - { name = "requests", marker = "python_full_version >= '3.12'" }, - { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [ @@ -2058,12 +2062,12 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "colorama", marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "starlette", marker = "python_full_version < '3.11'" }, - { name = "uvicorn", marker = "python_full_version < '3.11'" }, - { name = "watchfiles", marker = "python_full_version < '3.11'" }, - { name = "websockets", version = "16.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "colorama" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" } }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets", version = "16.1.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload-time = "2024-10-02T23:15:30.172Z" } wheels = [ @@ -2080,13 +2084,13 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "colorama" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "starlette", marker = "python_full_version >= '3.11'" }, - { name = "uvicorn", marker = "python_full_version >= '3.11'" }, - { name = "watchfiles", marker = "python_full_version >= '3.11'" }, - { name = "websockets", version = "17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "starlette" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets", version = "17.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/e0/3c/a59a3a453d4133777f7ed2e83c80b7dc817d43c74b74298ca0af869662ad/sphinx_autobuild-2025.8.25.tar.gz", hash = "sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213", size = 15200, upload-time = "2025-08-25T18:44:55.436Z" } wheels = [