feat: add updateAddon.py automated tool to complement existing#41
feat: add updateAddon.py automated tool to complement existing#41abdel792 wants to merge 41 commits into
Conversation
…ration merges for legacy add-ons. - Add tomlkit to project dependencies in pyproject.toml to support robust AST-aware TOML parsing. - Update updatingExistingAddons.md to provide clear instructions and prerequisites for the new automated tool. - Exclude the update script from ruff and pyright configurations to prevent strict environment linting conflicts.
|
Hi @nvdaes, I have just added you as a collaborator to this repository. If you have some time and interest, feel free to directly review and update the docstrings in Thank you so much for your help and guidance on this! |
|
Thanks @abdel792 . I've accepted your invitation as a collaborator, and I'll try to update the docstrings. |
|
@abdel792 , can we add a way to ignore files which shouldn't be merged? |
|
Thanks a lot @nvdaes for your quick commits and for improving the docstrings and file headers! Regarding your suggestions:
I'll let you know once I've drafted the file-ignoring feature so we can test it. Thanks again for your amazing collaboration! |
|
@abdel792 , I've reorganized the documentation so that info about the script is at the start. Perhaps the information about merge should be removed= |
- Remove trailing "Press Enter to exit..." prompt at successful script completion to allow seamless execution in automated environments. - Implement specific file/folder exclusion handling during synchronization, with full architecture setup requested by @CyrilleB79.
|
Hi @nvdaes, Thank you so much for updating the documentation! It looks great and makes using the automated tool very clear. Could you please do me a favor and also integrate the new feature requested by @CyrilleB79 that I just implemented in my latest commit? It allows developers to exclude specific template files during synchronization. Here is the markdown section that needs to be added to the documentation (you can place it right before the build verification step): ### Excluding specific template files
By default, the script synchronizes every infrastructure file provided by AddonTemplate.
If you want to preserve specific files from your repository (for example, a customized GitHub workflow), you can exclude them from synchronization.
Open `updateAddon.py` and locate the `IGNORED_FILES` set near the beginning of the `main()` function:
```python
IGNORED_FILES = {
os.path.join(".github", "workflows", "build_addon.yml").lower(),
}Add any relative path from the template root to this set to prevent that file from being synchronized. |
|
Hi @nvdaes, While looking closely at our documentation, I am considering a complete overhaul and restructuring of the documentation files to make everything cleaner, more cohesive, and easier to navigate for developers. Before diving into this, I wanted to open a discussion here to get your thoughts, ideas, or any suggestions you might have regarding how we should reorganize the content. Let me know what you think! |
- Completely restructure the guide to separate the recommended automated tool method from the manual Git merge workflow. - Integrate detailed instructions for the automated companion script (`updateAddon.py`). - Document the new template synchronization exclusions feature (`IGNORED_FILES`). - Improve overall clarity, formatting, and prerequisites for initial repository setup.
|
I have just committed a complete overhaul and reorganization of the update documentation ( In this update, I have:
Please let me know if you have any feedback or further suggestions. @nvdaes, please feel free to add, modify, or correct anything you see fit—you have the green light, of course! |
There was a problem hiding this comment.
Pull request overview
This PR introduces a developer-facing automation tool (updateAddon.py) intended to help migrate/update existing NVDA add-ons to the modern AddonTemplate structure, alongside documentation and dependency updates to support that workflow.
Changes:
- Added
updateAddon.pyto clone the latest AddonTemplate, sync infrastructure files, and mergebuildVars.py/pyproject.toml. - Updated
pyproject.tomldependencies (pyright bump + new tomlkit dependency) and excludedupdateAddon.pyfrom ruff/pyright checks. - Expanded
docs/managementFromGit/updatingExistingAddons.mdwith an “automated update” path plus revised manual instructions.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 11 comments.
| File | Description |
|---|---|
| updateAddon.py | New CLI tool that syncs template infrastructure and performs AST/TOML-based merges. |
| pyproject.toml | Adds tomlkit dependency and excludes the new script from lint/type-checking; bumps pyright. |
| docs/managementFromGit/updatingExistingAddons.md | Documents the new automated update workflow and revises the manual update steps. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
|
I suggest renaming |
|
Hi @wmhn1872265132, Thanks for the suggestion! However, I'm concerned that renaming it to updateTemplate.py might be a bit misleading. In this context, the "template" refers specifically to the upstream nvaccess/AddonTemplate repository. We aren't actually updating the template itself; rather, we are updating the local addon repository's infrastructure to align with the latest template standards. Keeping updateAddon.py helps clarify that the target of the update is the addon's repository, not the template. |
|
Hi all! You are discussing and working a lot and I'm not able to follow all this as would be needed, sorry. It's not clear to me if this tool is needed:
@abdel792 you write:
Do you mean in case 1 or case 2? If you meant case 2, it's not true at all. I too have had merge difficulties to update my add-ons from template, e.g. when the structure of the To me, upgrades from template now work correctly and I do not ask personally a new tool to perform this work, and won't probably need to use it. Sorry for the confusion. Of course, I have a lot of commits coming from the template in my add-on's history. This may be considered undesirable by some. To me, it's not a problem. I can easily ignore them doing Also small suggestion regarding the name: what about |
|
@CyrilleB79 wrote:
Imo, it's a good addition:
|
|
Sorry @nvdaes, I do not question the usefulness of tis tool. My question is if this tool is meant to address case 1 (first update of add-on from template), or case 2 (regular updates from template). |
|
@CyrilleB79 wrote:
My understanding is that this covers both cases, but I may be wrong. Let's wait for Abdel's reply. |
|
Hi @CyrilleB79, thank you for sharing your thoughts! And thanks @nvdaes for jumping in with those excellent points. To answer your question directly: as @nvdaes suspected, this tool is designed to address both cases.
It's completely optional, of course! Your manual Git merge workflow remains fully supported and valid (and is still detailed in the documentation). This tool simply offers a streamlined alternative. Regarding the name suggestion: |
- Rename `updateAddon.py` to `updateAddonFromTemplate.py` for clarity. - Update `pyproject.toml` to exclude the renamed script from ruff and pyright. - Overhaul `updatingExistingAddons.md` documentation to match the new script name and integrate Copilot's review recommendations regarding prerequisites, correct paths, and accurate backup details.
- Integrate upstream changes from Leonard de Ruijter. - Resolve merge conflict in pyproject.toml by merging build groups and retaining tomlkit.
|
Just a quick update regarding the recent merge conflict in It turns out it was caused by a recent upstream commit on the Everything is now sorted out and the branch is up to date! |
- Merge structural improvements from @nvdaes and the latest PR. - Restore critical details about the cleanup of placeholder metadata (such as conditional nvaccess author removal). - Clarify Git and companion tool prerequisites, aligning Python versions. - Format all paragraphs using @nvdaes' structural guidelines (frequent line breaks after periods) for optimal readability.
|
Hi @nvdaes, I have reorganized the integration guide by merging your structural improvements with the proposed template updates in this PR. To ensure we didn't lose any of your valuable contributions, I made sure to:
Please let me know if this reorganization looks good to you or if you would like any further adjustments! |
|
@abdel792 , I've pushed a commit updating the documentation.
Thanks for this amazing script! |
- Extract the "addon_url" metadata from buildVars.py when generating a new pyproject.toml.
- Write the "Repository" key to [project.urls], preserving empty values ("") if the URL is not set in the add-on.
|
Hi @nvdaes, Thank you so much for updating the documentation! The additions (adding I have also just pushed an update to the PR to handle the repository URL:
On a side note regarding the existing documentation and other suggestions:
If everything looks good to you with these latest changes, I'll go ahead and request a review from @seanbudd. Thanks again for your amazing collaboration on this! |
|
@abdel792 , the last commit about managing URL looks good to me. Thanks so much! |
- Rename the script from `updateAddonFromTemplate.py` to `syncAddonWithTemplate.py` to better reflect its synchronization purpose. - Update ruff and pyright exclusions and tool settings in `pyproject.toml` to reference the new file name. - Update the documentation (`updatingExistingAddons.md`) to align all text, examples, and `.addonmergeignore` instructions with the new module name. - Standardize all documentation commands to use the safer `uv run python` syntax.
|
Hi @nvdaes, @seanbudd, and everyone, I have just pushed a new update to the PR to finalize the tool's naming and refine the documentation:
@seanbudd, everything is fully updated, tested, and ready on our end. If you have no further suggestions or reviews to make, this PR is ready to be merged. Thank you all for this amazing collaboration! |
- Change `addonDir` from an optional flagged argument (`-ad`/`--addon-dir`) to a positional optional argument using `nargs="?"`. - Allow running the script with a target directory directly (e.g., `syncAddonWithTemplate.py myAddon`) without needing the `-ad` flag. - Preserve the default behavior (`None`/current directory) when no path argument is provided.
|
Hi @nvdaes, @seanbudd, and everyone, I have just pushed one final quality-of-life update to the script to align its CLI behavior with our documentation:
@seanbudd, this completes all refinements on our side. The implementation is now fully aligned, tested, and ready for your review whenever you are available. Thank you again! |
- Add instructions for running unit tests via pytest and uv. - Update syncAddonWithTemplate.py usage guides to enforce the mandatory -ad option. - Include guidelines for using uv run with the --with tomlkit flag to execute the companion tool without prior installation. - Align script usage and testing recommendations with guidelines from @seanbudd.
|
Hi @seanbudd, Thank you very much for your valuable feedback and excellent recommendations! I have updated the PR to fully align with your suggestions:
Additionally, regarding the Please let me know if you have any other recommendations or remarks—I would be more than happy to address them! Thank you again for your guidance on improving this workflow! |
…view * Script (`syncAddonWithTemplate.py`): * Replace stdout prints with structured logging for file output support * Refactor CLI argument parsing into a dedicated helper function * Generate sync report in Markdown format for better readability * Support tomlkit mutable sequences for author/maintainer checks * Remove global whitespace replacements on TOML output to avoid string corruption * Restore strictly tab-indented author/maintainer arrays via scoped block formatting * Replace naive text search with ast.Name verification to detect actual `os` module usage * Clean up trailing EOF whitespace * Configuration (`buildVars.py`): * Ensure single top-level import os insertion during AST-based merging when `os` is used * Documentation (`updatingExistingAddons.md`): * Remove duplicated instruction sections and fix broken Markdown code blocks * Defer unit testing documentation section to PR nvaccess#42
|
Hi @seanbudd and Copilot, Thank you both for the detailed and constructive code review! I have addressed all the feedback in the latest commit, including a few refinements following Copilot's suggestions: 1. Refactor & Python Script (
|
|
Hi everyone, As agreed with @seanbudd, the next PR will introduce a full unit test suite along with several configuration and documentation adjustments. Here is a detailed preview of what is scheduled: 1. Unit Test Suite (
|
Link to issue number:
Close #37.
Summary of the issue:
Upgrading an existing add-on to follow the modern
addonTemplatestructure manually is a repetitive and error-prone process. Developers frequently encounter syntax issues or merge conflicts when manually porting old metadata into the newpyproject.tomlstructure.Description of developer facing changes:
Introduces an automated update workflow. Developers can now run a single command (
uv run updateAddon.py) from any directory on their PC to automatically migrate metadata, clean template placeholder data (like removingnvaccessfrom third-party authors lists), and merge project configurations while preserving custom formatting.Description of development approach
updateAddon.pyat the repository root. The script leverages an AST-aware (Abstract Syntax Tree) approach to perform safe, robust parsing and merging of TOML structures.tomlkit==0.13.0under the# Update machinerysection inpyproject.tomlto support programmatic, comment-preserving TOML modifications.updateAddon.pyto theexcludelists of both[tool.ruff]and[tool.pyright]withinpyproject.tomlto avoid unnecessary environmental or strict typing alerts during standard repository validation.updatingExistingAddons.mdto cleanly integrate prerequisites (Python 3.11+, Git available in PATH) and step-by-step instructions on how to use this new companion tool alongside the existing manual instructions.Testing strategy:
The script and documentation workflow have been tested locally:
git fetch templateto ensure local tracking branches were up to date.uv run updateAddon.pyfrom the repository root, and verified that a_bak_backup directory was safely generated.pyproject.tomlto ensure old custom metadata was correctly merged, template placeholder defaults were stripped, and file formatting/comments remained completely intact.uv syncfollowed byuv run sconsto ensure the final environment synchronized properly and the.nvda-addonbundle compiled successfully with zero errors.Known issues with pull request:
None.
Code Review Checklist
updatingExistingAddons.md) has been explicitly updated to reflect these changes.