Skip to content

Comments

fix: update versioning constraint to support 3.14#706

Merged
aorumbayev merged 11 commits intomainfrom
fix/3.14-support
Jan 29, 2026
Merged

fix: update versioning constraint to support 3.14#706
aorumbayev merged 11 commits intomainfrom
fix/3.14-support

Conversation

@aorumbayev
Copy link
Contributor

@aorumbayev aorumbayev commented Jan 29, 2026

Proposed changes

  • Add Python 3.14 support across workflows, docs, and pyproject.toml
  • Centralize TOML parsing logic in new src/algokit/core/_toml.py module
  • Move sphinxnotes-markdown-builder to optional [tool.poetry.group.docs] (not yet compatible with 3.14)
  • Update copier to caret versioning; pin pywin32 for Windows/Python 3.14
  • Streamline docs dependency installation in CI workflows
  • Normalize test output for Python 3.14+ msgpack error message changes

Further notes

Why Copier Was Pinned in the first place?

Initial Issue (PR #634, ~May 2025)

When copier was updated from ^9.6.0 to 9.7.1, version 9.7.0 introduced breaking API changes:

  1. Question model now requires context parameter — See src/algokit/core/init.py:48-50:

    # https://github.com/copier-org/copier/releases/tag/v9.7.0 introduces changes to Question model,
    # which now requires passing context param.
    context={**worker._render_context(), **answers.combined},
  2. Internal module reorganization — Imports changed from public to private APIs:

    • copier.maincopier._main
    • copier.typescopier._types
    • copier.user_datacopier._user_data

The Problematic Versions (9.7.1 → 9.10.1, Aug–Sep 2025)

After PR #634 pinned to 9.7.1, Dependabot repeatedly tried to bump copier but these PRs were closed without merging:

PR Attempted Bump Status
#678 9.7.1 → 9.9.1 CLOSED
#676 Similar attempt CLOSED
#674 Similar attempt CLOSED
#673 Similar attempt CLOSED

The issues that caused these failures:

  • v9.8.0: Added stricter "validate default answers" which likely broke snapshot tests
  • v9.9.0: Changed "secret question validator" behavior during answer replay

These changes affected how copier processed template answers, causing snapshot test output to differ.


The Security Fix (Commit 827b592, Sep 3, 2025)

The team decided to skip the problematic 9.8.x and 9.9.x versions entirely and jump to 9.10.1 with an explicit pin:

copier = "9.10.1"  # Pinned as we have seen breaking changes in minor releases. Updates should be tested before bumping.

Why PR #706 Could Bump to Latest

The successful bump (Jan 29, 2026):

PR #706 bumped from 9.10.1^9.11.3 with zero code changes and all tests passed (Python 3.10–3.14). Here's why:

  1. Backward Compatibility Maintained: The workaround code from PR chore: updated relevant to packages in order to update h11 #634 (passing context to Question) still works perfectly with copier 9.11.3

  2. Issues Fixed in Later Versions: The validation and answer handling issues that plagued 9.8.x and 9.9.x were resolved or stabilized by 9.10.x/9.11.x

  3. Relevant fixes in 9.11.x:

    • v9.11.0: "fix using default answers from settings for required questions" (#2374)
    • v9.11.3: "include non-question answers when generating fresh copy"

    These fixes likely resolved the issues that were causing snapshot test failures in the intermediate versions.

  4. No New Breaking Changes: Copier 9.11.x didn't introduce new breaking API changes — it maintained compatibility with the _main, _types, _user_data import structure and Question context parameter pattern established in 9.7.0.

@github-actions
Copy link

github-actions bot commented Jan 29, 2026

Coverage

Coverage Report
FileStmtsMissCoverMissing
src/algokit
   __init__.py15753%6–13, 17–24, 32–34
   __main__.py440%1–6
src/algokit/cli
   __init__.py47394%31–34
   codespace.py50982%28, 114, 137, 150–155
   completions.py108992%63–64, 83, 93–99
   dispenser.py121199%77
   doctor.py90693%159, 171–173, 202–203
   explore.py691775%35–40, 42–47, 85–92, 115–116, 121
   generate.py78890%76–77, 169, 178–179, 182–183, 186
   goal.py54689%67, 85, 96, 107–109
   localnet.py1693281%75, 96–123, 175–179, 223, 245, 260–270, 284, 337, 358–359
   task.py34391%25–28
src/algokit/cli/common
   utils.py37295%137, 139
src/algokit/cli/compilers
   typescript.py28196%59
src/algokit/cli/init
   command.py2672491%315–316, 321–322, 325, 346, 349–351, 362, 366, 424, 450, 479, 512, 521–523, 526–531, 544, 563, 575–576
   helpers.py37197%47
src/algokit/cli/project
   __init__.py23196%31
   bootstrap.py40198%35
   deploy.py1172083%47, 49, 102, 125, 147–149, 270, 277, 291–299, 302–311
   link.py811285%60, 65–66, 110–115, 143–144, 213–214, 218
   list.py33585%21–23, 51–56
   run.py46296%38, 174
src/algokit/cli/tasks
   analyze.py81199%81
   assets.py841385%70–71, 77, 79–80, 110, 125, 135–136, 144, 146, 148–149
   ipfs.py51884%52, 80, 92, 94–95, 105–107
   mint.py1061586%51, 73, 100–103, 108, 113, 131–132, 158, 335–339
   send_transaction.py661183%18, 54–55, 59, 91, 160, 172–176
   sign_transaction.py59886%21, 28–30, 71–72, 109, 123
   transfer.py35197%80
   utils.py1144660%24–32, 38–41, 73–74, 98–99, 123–131, 150–160, 207, 256–257, 277–288, 295–297, 319
   vanity_address.py561082%41, 45–48, 112, 114, 121–123
   wallet.py79495%21, 66, 136, 162
src/algokit/cli/tui/init
   example_selector.py17382%29–30, 34
src/algokit/cli/tui/init/screens
   example_selector_screen.py311455%12, 32–35, 38–51, 56–59
src/algokit/core
   codespace.py1756861%34–37, 41–44, 48–71, 111–112, 125–133, 191, 200–202, 210, 216–217, 229–236, 251–298, 311–313, 338–344, 348, 395
   conf.py54885%20, 24, 32, 34, 69–71, 76
   dispenser.py2022687%92, 124–125, 142–150, 192–193, 199–201, 219–220, 260–261, 319, 333–335, 346–347, 357, 370, 385
   doctor.py65789%67–69, 92–94, 134
   generate.py50394%44, 85, 103
   goal.py65494%21, 36–37, 47
   init.py1215158%62, 66–71, 79, 88, 95, 121–122, 141–142, 147–171, 176–201, 214–225
   log_handlers.py68790%50–51, 63, 112–116, 125
   proc.py45198%100
   sandbox.py3263091%34, 86–89, 94, 98–100, 176, 228–235, 246, 303, 361–362, 389–390, 632, 648, 663–665, 681
   typed_client_generation.py2445080%84–86, 136, 169–174, 178–207, 231, 234–237, 255, 258–261, 321–332, 346, 352, 355–358
   utils.py1725369%25–27, 46, 65–66, 72–84, 140–146, 170, 173, 179–192, 221–223, 252–255, 275, 294–304
src/algokit/core/_vendor/auth0/authentication
   token_verifier.py15711129%16, 45, 58, 73–85, 98–107, 119–124, 136–137, 140, 170, 178–180, 190–199, 206–213, 227–236, 258, 280–287, 314–323, 333–444
src/algokit/core/compilers
   python.py28582%19–20, 25, 49–50
   typescript.py461078%26, 32, 35–38, 78–79, 88–89
src/algokit/core/config_commands
   container_engine.py412149%24, 29–31, 47–76
   js_package_manager.py361169%30–33, 38, 49–59
   py_package_manager.py361169%30–33, 38, 49–59
   version_prompt.py921485%37–38, 68, 87–90, 108, 118–125, 148
src/algokit/core/project
   __init__.py53394%50, 86, 145
   bootstrap.py3145483%63, 70–72, 80–82, 87–88, 132, 141, 169–181, 223, 236–237, 289, 346, 425–426, 448, 475, 527–528, 534–540, 567–593, 610, 622–628, 640–642
   deploy.py69987%108–111, 120–122, 126, 131
   run.py1321390%83, 88, 97–98, 133–134, 138–139, 143, 147, 277–278, 293
src/algokit/core/tasks
   analyze.py93397%105–112, 187
   ipfs.py63789%58–64, 140, 144, 146, 152
   nfd.py491373%25, 31, 34–41, 70–72, 99–101
   vanity_address.py903462%49–50, 54, 59–75, 92–108, 128–131
   wallet.py71593%37, 129, 155–157
src/algokit/core/tasks/mint
   mint.py74988%123–133
   models.py921782%50, 52, 57, 71–74, 81–90
TOTAL566196683% 

Tests Skipped Failures Errors Time
593 0 💤 0 ❌ 0 🔥 45.095s ⏱️

@aorumbayev aorumbayev marked this pull request as ready for review January 29, 2026 14:34
@aorumbayev aorumbayev merged commit b6be55a into main Jan 29, 2026
20 checks passed
@aorumbayev aorumbayev deleted the fix/3.14-support branch January 29, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants