Repository navigation
Fix add-on failing to load on NVDA alpha: config.isAppX was removed - #64
Merged
Merged
Conversation
nvaccess/nvda#20681 removed config.isAppX, so reading it raised AttributeError and GlobalPlugin.__init__ failed. Read it with getattr(config, "isAppX", False); older NVDA versions define it as a module attribute, so their behaviour is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
serrebidev
force-pushed
the
fix-isappx-only
branch
from
September 29, 2026 18:51
8ecafd7 to
470e8c1
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #63 with only the needed change.
Problem
nvaccess/nvda#20681 (merged 2026-09-29, NVDA 2027.1 alpha) removed
config.isAppXas a documented breaking change.config.__getattr__now raisesAttributeError, soGlobalPlugin.__init__fails and the add-on never loads:Change
config.isAppXbecomesgetattr(config, "isAppX", False). The# Security checkscomment moves to the line above, because the longer line with the trailing comment is 112 characters, over the 110line-length. With the comment left inline,ruff formatwould wrap the condition across three lines.No change in behaviour on older NVDA versions.
config.isAppXis a module attribute there (isAppX = Falseinsource/config/__init__.pyon bothrelease-2025.3.3, the add-on's minimum version, andrelease-2026.1, its last tested version), sogetattrreturns the same value. On NVDA versions without the attribute the default isFalse, which is correct because Store builds no longer exist.Testing
Tested on NVDA alpha-57943 (installed copy). I built both packages with
sconsfrom a clean checkout, and the only difference between them is this change. For each run I extracted the package into the add-on folder, started NVDA with the samenvda.ini(channel = 0), and checked the log:AttributeErrorabove, and the add-on does not load.Functional checks with this branch, driven through NVDA:
channel = 1), which exercises theindex > 0path in__init__: loads with no errors.onDiscard) closes the dialog with no errors.onSave), then saving the configuration, writeschannel = 2tonvda.ini, with no errors.Lint:
ruff checkandruff format --checkwith the repo's pinned versions pass on the committed file.pyrightreports 264 errors on this branch against 265 on master. The only difference is that master'sType of "isAppX" is unknownerror is gone, and no new diagnostics appear.Two existing issues I noticed but did not change
if index > len(channels):inGlobalPlugin.__init__should probably be>=. A storedchannelequal tolen(channels)(for example 4, left behind by a modified copy of the add-on) passes the check and raisesIndexError: list index out of rangeatchannels[index]. I can send a separate PR if you want one.availableUpdatesis never filled forsnapshot:alpha, and the background thread stays alive while it waits onself.event. This PR does not touch that code.🤖 Generated with Claude Code