diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc index 13f21073eb5..64db4635da0 100644 --- a/.markdownlint.jsonc +++ b/.markdownlint.jsonc @@ -29,5 +29,10 @@ "fenced-code-language": false, "ul-style": { "style": "asterisk" + }, + "table-column-style": { + // MD060: Tables use single padding around the column delimiters. + // e.g. | Column 1 | Column 2 | + "style": "compact" } } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 92aac966a7d..6d5d4e95f96 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -108,7 +108,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Matches Ruff version in pyproject. - rev: v0.14.5 + rev: v0.15.4 hooks: - id: ruff name: lint with ruff @@ -117,7 +117,7 @@ repos: name: format with ruff - repo: https://github.com/astral-sh/uv-pre-commit - rev: 0.9.11 + rev: 0.10.6 hooks: - id: uv-lock name: Verify uv lock file @@ -125,7 +125,7 @@ repos: args: ["-p3.13"] - repo: https://github.com/DavidAnson/markdownlint-cli2 - rev: v0.18.1 + rev: v0.21.0 hooks: - id: markdownlint-cli2 name: Lint markdown files diff --git a/ensureuv.ps1 b/ensureuv.ps1 index de7f212a269..9dfa34f5ab2 100644 --- a/ensureuv.ps1 +++ b/ensureuv.ps1 @@ -6,7 +6,7 @@ param( $ErrorActionPreference = 'Stop' Set-StrictMode -Version Latest -[Version]$UvVersion = '0.9.11' +[Version]$UvVersion = '0.10.6' function Invoke-Uv { & uv @UvArgs diff --git a/projectDocs/community/expertsList.md b/projectDocs/community/expertsList.md index cc2f8d13688..aaee75beb26 100644 --- a/projectDocs/community/expertsList.md +++ b/projectDocs/community/expertsList.md @@ -9,7 +9,7 @@ For optimal responses, please avoid tagging NV Access employees on unrelated tic General enquiries should be directed to . | GitHub | email | topics | -|---|---|---| +| --- | --- | --- | | @gerald-hartig | | Controversial product decisions | | @seanbudd | | Issue triage, technical decisions | | @SaschaCowley | | Issue triage, technical decisions | @@ -19,7 +19,7 @@ General enquiries should be directed to . ## Community | GitHub | email | topics | -|---|---|---| +| --- | --- | --- | | @codeofdusk | | Windows Terminal and console, Microsoft UI Automation | | @nvdaes | | Add-on store, braille | | @michaelweghorn | | LibreOffice | diff --git a/projectDocs/dev/developerGuide/developerGuide.md b/projectDocs/dev/developerGuide/developerGuide.md index 0f65dbff7a9..459fcb461fb 100644 --- a/projectDocs/dev/developerGuide/developerGuide.md +++ b/projectDocs/dev/developerGuide/developerGuide.md @@ -1473,13 +1473,13 @@ NVDA's `extensionPoints` module allows code in different parts of NVDA, or in ad There are five kinds of extension point: -| Type |Purpose| -|---|---| -|`Action` |Allows some code to find out what other code is doing. For example, an add-on can be notified before or after a config profile changes.| -|`Filter` |Edits data. A filter registered in the speech module, might allow changing speech strings before they are spoken.| -|`Decider` |Runs each registered handler until one of them returns `False`. If one does, it can be used to prevent the invoking code from running.| -|`AccumulatingDecider` |Like `Decider`, but always runs all of its registered handlers, and only decides if one of them failed at the end. The expected result of each is `True` by default, though expecting `False` is possible.| -|`Chain` |Allows registering handlers that return iterables (mainly generators). Calling `iter` on the `Chain` returns a generator that iterates over all the handlers.| +| Type | Purpose | +| --- | --- | +| `Action` | Allows some code to find out what other code is doing. For example, an add-on can be notified before or after a config profile changes. | +| `Filter` | Edits data. A filter registered in the speech module, might allow changing speech strings before they are spoken. | +| `Decider` | Runs each registered handler until one of them returns `False`. If one does, it can be used to prevent the invoking code from running. | +| `AccumulatingDecider` | Like `Decider`, but always runs all of its registered handlers, and only decides if one of them failed at the end. The expected result of each is `True` by default, though expecting `False` is possible. | +| `Chain` | Allows registering handlers that return iterables (mainly generators). Calling `iter` on the `Chain` returns a generator that iterates over all the handlers. | The sections below provide the list of currently defined extension points in NVDA, along with brief descriptions for them. Please see code documentation in the associated files, or the code itself, for further explanation. @@ -1489,145 +1489,145 @@ For examples of how to define and use new extension points, please see the code ### braille {#brailleExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Filter` |`filter_displaySize` | [Deprecated] Allows components or add-ons to change the display size used for braille output.| -|`Filter` |`filter_displayDimensions` | Allows components or add-ons to change the number of rows and columns of the display used for braille output.| -|`Action` |`displaySizeChanged` |Notifies of display size changes.| -|`Action` |`pre_writeCells` |Notifies when cells are about to be written to a braille display| -|`Action` |`displayChanged` |Notifies of braille display changes.| -|`Decider` |`decide_enabled` |Allows deciding whether the braille handler should be forcefully disabled.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Filter` | `filter_displaySize` | [Deprecated] Allows components or add-ons to change the display size used for braille output. | +| `Filter` | `filter_displayDimensions` | Allows components or add-ons to change the number of rows and columns of the display used for braille output. | +| `Action` | `displaySizeChanged` | Notifies of display size changes. | +| `Action` | `pre_writeCells` | Notifies when cells are about to be written to a braille display | +| `Action` | `displayChanged` | Notifies of braille display changes. | +| `Decider` | `decide_enabled` | Allows deciding whether the braille handler should be forcefully disabled. | ### appModuleHandler {#appModuleHandlerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`post_appSwitch` |Triggered when the foreground application changes| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `post_appSwitch` | Triggered when the foreground application changes | ### addonHandler {#addonHandlerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`AccumulatingDecider` |`isCLIParamKnown` |Allows adding NVDA commandline parameters which apply to plugins. See [this section of the Dev Guide](#PluginCLIArgs) for more information.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `AccumulatingDecider` | `isCLIParamKnown` | Allows adding NVDA commandline parameters which apply to plugins. See [this section of the Dev Guide](#PluginCLIArgs) for more information. | ### brailleViewer {#brailleViewerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`postBrailleViewerToolToggledAction` |Triggered every time the Braille Viewer is created / shown or hidden / destroyed.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `postBrailleViewerToolToggledAction` | Triggered every time the Braille Viewer is created / shown or hidden / destroyed. | ### config {#configExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`post_configProfileSwitch` |Notifies after the configuration profile has been switched.| -|`Action` |`pre_configSave` |Notifies before NVDA's configuration is saved to disk.| -|`Action` |`post_configSave` |Notifies after NVDA's configuration has been saved to disk.| -|`Action` |`pre_configReset` |Notifies before configuration is reloaded from disk or factory defaults are applied.| -|`Action` |`post_configReset` |Notifies after configuration has been reloaded from disk or factory defaults were applied.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `post_configProfileSwitch` | Notifies after the configuration profile has been switched. | +| `Action` | `pre_configSave` | Notifies before NVDA's configuration is saved to disk. | +| `Action` | `post_configSave` | Notifies after NVDA's configuration has been saved to disk. | +| `Action` | `pre_configReset` | Notifies before configuration is reloaded from disk or factory defaults are applied. | +| `Action` | `post_configReset` | Notifies after configuration has been reloaded from disk or factory defaults were applied. | ### core {#coreExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`postNvdaStartup` |Notifies after NVDA has finished starting up.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `postNvdaStartup` | Notifies after NVDA has finished starting up. | ### inputCore {#inputCoreExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Decider` |`decide_handleRawKey` |Notifies when a raw keyboard event is received, before any NVDA processing, allowing other code to decide if it should be handled.| -|`Decider` |`decide_executeGesture` |Notifies when a gesture is about to be executed, allowing other code to decide if it should be.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Decider` | `decide_handleRawKey` | Notifies when a raw keyboard event is received, before any NVDA processing, allowing other code to decide if it should be handled. | +| `Decider` | `decide_executeGesture` | Notifies when a gesture is about to be executed, allowing other code to decide if it should be. | ### logHandler {#logHandlerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`_onErrorSoundRequested` |Triggered every time an error sound needs to be played. This extension point should not be used directly but retrieved calling `getOnErrorSoundRequested()` instead.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `_onErrorSoundRequested` | Triggered every time an error sound needs to be played. This extension point should not be used directly but retrieved calling `getOnErrorSoundRequested()` instead. | ### nvwave {#nvwaveExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Decider` |`decide_playWaveFile` |Notifies when a wave file is about to be played, allowing other code to decide if it should be.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Decider` | `decide_playWaveFile` | Notifies when a wave file is about to be played, allowing other code to decide if it should be. | ### speech {#speechExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`speechCanceled` |Triggered when speech is canceled.| -|`Action` |`pre_speechCanceled` |Triggered before speech is canceled.| -|`Action` |`pre_speech` |Triggered before NVDA handles prepared speech.| -|`Action` |`post_speechPaused` |Triggered when speech is paused or resumed.| -|`Action` |`pre_speechQueued` |Triggered after speech is processed and normalized and directly before it is enqueued.| -|`Filter` |`filter_speechSequence` |Allows components or add-ons to filter speech sequence before it passes to the synth driver.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `speechCanceled` | Triggered when speech is canceled. | +| `Action` | `pre_speechCanceled` | Triggered before speech is canceled. | +| `Action` | `pre_speech` | Triggered before NVDA handles prepared speech. | +| `Action` | `post_speechPaused` | Triggered when speech is paused or resumed. | +| `Action` | `pre_speechQueued` | Triggered after speech is processed and normalized and directly before it is enqueued. | +| `Filter` | `filter_speechSequence` | Allows components or add-ons to filter speech sequence before it passes to the synth driver. | ### synthDriverHandler {#synthDriverHandlerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`synthIndexReached` |Notifies when a synthesizer reaches an index during speech.| -|`Action` |`synthDoneSpeaking` |Notifies when a synthesizer finishes speaking.| -|`Action` |`synthChanged` |Notifies of synthesizer changes.| -|`Action` |`pre_synthSpeak` |Notifies when the current synthesizer is about to speak something.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `synthIndexReached` | Notifies when a synthesizer reaches an index during speech. | +| `Action` | `synthDoneSpeaking` | Notifies when a synthesizer finishes speaking. | +| `Action` | `synthChanged` | Notifies of synthesizer changes. | +| `Action` | `pre_synthSpeak` | Notifies when the current synthesizer is about to speak something. | ### tones {#tonesExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Decider` |`decide_beep` |Notifies when a beep is about to be generated and played, allowing a component to decide whether it should be.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Decider` | `decide_beep` | Notifies when a beep is about to be generated and played, allowing a component to decide whether it should be. | ### treeInterceptorHandler {#treeInterceptorHandlerExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`post_browseModeStateChange` |Notifies when browse mode state changes.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `post_browseModeStateChange` | Notifies when browse mode state changes. | ### utils.security {#utils_securityExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`post_sessionLockStateChanged` |Notifies when a session lock or unlock event occurs.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `post_sessionLockStateChanged` | Notifies when a session lock or unlock event occurs. | ### winAPI._displayTracking {#winAPI_displayTrackingExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`displayChanged` |Notifies when display configuration changes (resolution, monitor setup, etc.). Handlers receive the `OrientationState` as an argument.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `displayChanged` | Notifies when display configuration changes (resolution, monitor setup, etc.). Handlers receive the `OrientationState` as an argument. | ### winAPI.messageWindow {#winAPI_messageWindowExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`pre_handleWindowMessage` |Notifies when NVDA receives a window message, allowing components to perform an action when certain system events occur.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `pre_handleWindowMessage` | Notifies when NVDA receives a window message, allowing components to perform an action when certain system events occur. | ### winAPI.secureDesktop {#winAPI_secureDesktopExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Action` |`winAPI.secureDesktop.post_secureDesktopStateChange` |Notifies when the user has switched to/from the secure desktop| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Action` | `winAPI.secureDesktop.post_secureDesktopStateChange` | Notifies when the user has switched to/from the secure desktop | ### bdDetect {#bdDetectExtPts} -| Type |Extension Point |Description| -|---|---|---| -|`Chain` |`scanForDevices` |Can be iterated to scan for braille devices.| +| Type | Extension Point | Description | +| --- | --- | --- | +| `Chain` | `scanForDevices` | Can be iterated to scan for braille devices. | ### vision.visionHandlerExtensionPoints.EventExtensionPoints {#visionExtPts} These extension points are expected to be used and registered to differently than other extension points. Please see the `EventExtensionPoints` class documentation for more information, and detailed descriptions. -| Type |Extension Point |Notifies a vision enhancement provider when ...| -|---|---|---| -|`Action` |`post_objectUpdate` |an object property has changed.| -|`Action` |`post_focusChange` |the focused NVDAObject has changed.| -|`Action` |`post_foregroundChange` |the foreground NVDAObject has changed.| -|`Action` |`post_caretMove` |a physical caret has moved.| -|`Action` |`post_browseModeMove` |a virtual caret has moved.| -|`Action` |`post_reviewMove` |the position of the review cursor has changed.| -|`Action` |`post_mouseMove` |the mouse has moved.| -|`Action` |`post_coreCycle` |the end of each core cycle has been reached.| +| Type | Extension Point | Notifies a vision enhancement provider when ... | +| --- | --- | --- | +| `Action` | `post_objectUpdate` | an object property has changed. | +| `Action` | `post_focusChange` | the focused NVDAObject has changed. | +| `Action` | `post_foregroundChange` | the foreground NVDAObject has changed. | +| `Action` | `post_caretMove` | a physical caret has moved. | +| `Action` | `post_browseModeMove` | a virtual caret has moved. | +| `Action` | `post_reviewMove` | the position of the review cursor has changed. | +| `Action` | `post_mouseMove` | the mouse has moved. | +| `Action` | `post_coreCycle` | the end of each core cycle has been reached. | ## Communicating with the user @@ -1792,7 +1792,7 @@ A `Button` is an immutable data structure containing all of the information need Its fields are as follows: | Field | Type | Default | Explanation | -|---|---|---|---| +| --- | --- | --- | --- | | `id` | `ReturnCode` | No default | The ID used to refer to the button. | | `label` | `str` | No default | The text label to display on the button. Prefix accelerator keys with an ampersand (&). | | `callback` | `Callable` or `None` | `None` | The function to call when the button is clicked. This is most useful for non-modal dialogs. | @@ -1819,7 +1819,7 @@ You can also add any of these buttons to an existing `MessageDialog` instance wi The following default buttons are available: | Button | Label | ID/return code | Closes dialog | Add button helper | -|---|---|---|---|---| +| --- | --- | --- | --- | --- | | `APPLY` | &Apply | `ReturnCode.APPLY` | No | `addApplyButton` | | `CANCEL` | Cancel | `ReturnCode.CANCEL` | Yes | `addCancelButton` | | `CLOSE` | Close | `ReturnCode.CLOSE` | Yes | `addCloseButton` | @@ -1835,7 +1835,7 @@ You can also add any of these default button sets to an existing `MessageDialog` The following default button sets are available: | Button set | Contains | Add button set helper | Notes | -|---|---|---|---| +| --- | --- | --- | --- | | `OK_CANCEL` | `DefaultButton.OK` and `DefaultButton.Cancel` | `addOkCancelButtons` | | | `YES_NO` | `DefaultButton.YES` and `DefaultButton.NO` | `addYesNoButtons` | You must set a fallback action if you want the user to be able to press escape to close a dialog with only these buttons. | | `YES_NO_CANCEL` | `DefaultButton.YES`, `DefaultButton.NO` and `DefaultButton.CANCEL` | `addYesNoCancelButtons` | | @@ -1861,7 +1861,7 @@ They are all thread safe. The following convenience class methods are provided (keyword arguments for overriding button labels indicated in parentheses): | Method | Buttons | Return values | -|---|---|---| +| --- | --- | --- | | `alert` | OK (`okLabel`) | `None` | | `confirm` | OK (`okLabel`) and Cancel (`cancelLabel`) | `ReturnCode.OK` or `ReturnCode.CANCEL` | | `ask` | Yes (`yesLabel`), No (`noLabel`) and Cancel (`cancelLabel`) | `ReturnCode.YES`, `ReturnCode.NO` or `ReturnCode.CANCEL` | diff --git a/projectDocs/dev/userGuideStandards.md b/projectDocs/dev/userGuideStandards.md index a6d7d5adb4d..8ee6e168e83 100644 --- a/projectDocs/dev/userGuideStandards.md +++ b/projectDocs/dev/userGuideStandards.md @@ -28,13 +28,13 @@ This setting allows the feature of using functionality in a certain situation to If necessary, a description of a common use case that is supported by each option. | . {.hideHeaderRow} |.| -|---|---| +| --- | --- | |Options |Default (Enabled), Disabled, Enabled | |Default |Enabled | |Toggle command |`NVDA+shift+e` | |Option |Behaviour | -|---|---| +| --- | --- | |Enabled |behaviour of enabled | |Disabled |behaviour of disabled | ``` @@ -107,7 +107,7 @@ For example: #### Braille Tethered To | . {.hideHeaderRow} |.| -|---|---| +| --- | --- | | Desktop command | `NVDA+control+t` | | Laptop Command | `NVDA+control+t` | diff --git a/pyproject.toml b/pyproject.toml index 6b5a1b802ad..9615aa4e142 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -322,10 +322,10 @@ dev = [ "py2exe==0.14.0.0", "setuptools~=80.10.2", "nvda-mathcat", - "uv==0.9.11", + "uv==0.10.6", ] lint = [ - "ruff==0.14.5", + "ruff==0.15.4", "pre-commit==4.2.0", "pyright[nodejs]==1.1.407", ] diff --git a/source/NVDAObjects/IAccessible/winword.py b/source/NVDAObjects/IAccessible/winword.py index 061301b768c..040a6c4b8b8 100644 --- a/source/NVDAObjects/IAccessible/winword.py +++ b/source/NVDAObjects/IAccessible/winword.py @@ -405,9 +405,9 @@ def _moveInTable(self, row=True, forward=True): return False _cell = table.cell getCell = ( # noqa: E731 - lambda thisIndex, otherIndex: _cell(thisIndex, otherIndex) - if row - else _cell(otherIndex, thisIndex) + lambda thisIndex, otherIndex: ( + _cell(thisIndex, otherIndex) if row else _cell(otherIndex, thisIndex) + ) ) # noqa: E731 thisIndex = rowNumber if row else columnNumber otherIndex = columnNumber if row else rowNumber diff --git a/source/_bridge/runtimes/synthDriverHost/config.py b/source/_bridge/runtimes/synthDriverHost/config.py index 1cb7de79128..fc623aa6bbb 100644 --- a/source/_bridge/runtimes/synthDriverHost/config.py +++ b/source/_bridge/runtimes/synthDriverHost/config.py @@ -10,9 +10,11 @@ # This should be converted to a proper proxy. class FakeConfDict(dict): getConfigValidation = staticmethod( - lambda path: types.SimpleNamespace(default="default") - if path[0] == "audio" and path[1] == "outputDevice" - else None, + lambda path: ( + types.SimpleNamespace(default="default") + if path[0] == "audio" and path[1] == "outputDevice" + else None + ), ) diff --git a/source/brailleDisplayDrivers/brailliantB.py b/source/brailleDisplayDrivers/brailliantB.py index e411a7c8b31..e7fdd639888 100644 --- a/source/brailleDisplayDrivers/brailliantB.py +++ b/source/brailleDisplayDrivers/brailliantB.py @@ -119,31 +119,35 @@ def registerAutomaticDetection(cls, driverRegistrar: bdDetect.DriverRegistrar): ) driverRegistrar.addBluetoothDevices( lambda m: ( - m.type == bdDetect.ProtocolType.SERIAL - and ( - m.id.startswith("Brailliant B") or m.id == "Brailliant 80" or "BrailleNote Touch" in m.id + ( + m.type == bdDetect.ProtocolType.SERIAL + and ( + m.id.startswith("Brailliant B") + or m.id == "Brailliant 80" + or "BrailleNote Touch" in m.id + ) ) - ) - or ( - m.type == bdDetect.ProtocolType.HID - and m.deviceInfo.get("manufacturer") == "Humanware" - and ( - ( - m.deviceInfo.get("product") + or ( + m.type == bdDetect.ProtocolType.HID + and m.deviceInfo.get("manufacturer") == "Humanware" + and ( + ( + m.deviceInfo.get("product") + in ( + "APH Chameleon 20", + "APH Mantis Q40", + "Brailliant BI 40X", + "Brailliant BI 20X", + ) + and bdDetect._isHIDUsagePageMatch(m, HID_USAGE_PAGE) + ) + or m.deviceInfo.get("product") in ( - "APH Chameleon 20", - "APH Mantis Q40", - "Brailliant BI 40X", - "Brailliant BI 20X", + "Brailliant HID", + "Humanware BrailleOne", + "NLS eReader", + "NLS eReader Humanware", ) - and bdDetect._isHIDUsagePageMatch(m, HID_USAGE_PAGE) - ) - or m.deviceInfo.get("product") - in ( - "Brailliant HID", - "Humanware BrailleOne", - "NLS eReader", - "NLS eReader Humanware", ) ) ), diff --git a/source/brailleDisplayDrivers/freedomScientific.py b/source/brailleDisplayDrivers/freedomScientific.py index ce6ebb00901..5511d700b4d 100755 --- a/source/brailleDisplayDrivers/freedomScientific.py +++ b/source/brailleDisplayDrivers/freedomScientific.py @@ -209,15 +209,13 @@ def registerAutomaticDetection(cls, driverRegistrar: bdDetect.DriverRegistrar): ) driverRegistrar.addBluetoothDevices( - lambda m: ( - any( - m.id.startswith(prefix) - for prefix in ( - "F14", - "Focus 14 BT", - "Focus 40 BT", - "Focus 80 BT", - ) + lambda m: any( + m.id.startswith(prefix) + for prefix in ( + "F14", + "Focus 14 BT", + "Focus 40 BT", + "Focus 80 BT", ) ), ) diff --git a/source/gui/addonStoreGui/controls/messageDialogs.py b/source/gui/addonStoreGui/controls/messageDialogs.py index 1f91c5ed2a5..9017608ecfd 100644 --- a/source/gui/addonStoreGui/controls/messageDialogs.py +++ b/source/gui/addonStoreGui/controls/messageDialogs.py @@ -833,11 +833,13 @@ def _getAddonsToCopy(parent: wx.Window) -> list[str] | None: addonsToCopy: list[str] = [] enabledAddons: tuple[Addon] = tuple( getAvailableAddons( - filterFunc=lambda addon: getStatus(addon._addonGuiModel, _StatusFilterKey.INSTALLED) - in ( - AvailableAddonStatus.ENABLED, - AvailableAddonStatus.RUNNING, - AvailableAddonStatus.INCOMPATIBLE_ENABLED, + filterFunc=lambda addon: ( + getStatus(addon._addonGuiModel, _StatusFilterKey.INSTALLED) + in ( + AvailableAddonStatus.ENABLED, + AvailableAddonStatus.RUNNING, + AvailableAddonStatus.INCOMPATIBLE_ENABLED, + ) ), ), ) diff --git a/source/gui/addonStoreGui/viewModels/store.py b/source/gui/addonStoreGui/viewModels/store.py index 6adc3f4e861..5572acbc49d 100644 --- a/source/gui/addonStoreGui/viewModels/store.py +++ b/source/gui/addonStoreGui/viewModels/store.py @@ -265,8 +265,9 @@ def _makeActionsList(self): # Translators: Label for an action that opens the VirusTotal scan results for the selected addon displayName=pgettext("addonStore", "VirusTotal scan results"), actionHandler=lambda aVM: startfile(cast(_AddonStoreModel, aVM.model).scanResults.scanUrl), - validCheck=lambda aVM: isinstance(aVM.model, _AddonStoreModel) - and aVM.model.scanResults is not None, + validCheck=lambda aVM: ( + isinstance(aVM.model, _AddonStoreModel) and aVM.model.scanResults is not None + ), actionTarget=selectedListItem, ), AddonActionVM( diff --git a/tests/manual/nvdaUI/addonStore.md b/tests/manual/nvdaUI/addonStore.md index 7fef178bf57..bbcb50c0086 100644 --- a/tests/manual/nvdaUI/addonStore.md +++ b/tests/manual/nvdaUI/addonStore.md @@ -297,7 +297,7 @@ Typically, this requires a contributor creating 3 different versions of the same * (X+1).1 e.g `CURRENT=2024.1`, `BACK_COMPAT_TO=2024.1` | Test Name | Upgrade from | Upgrade to | Test notes | -|---|---|---|---| +| --- | --- | --- | --- | | Upgrade to different NVDA version in the same API breaking release cycle | X.1 | X.1 | Add-ons which remain incompatible are listed as incompatible on upgrading. Preserves state of enabled incompatible add-ons | | Upgrade to a different but compatible API version | X.1 | X.2 | Add-ons which remain incompatible are listed as incompatible on upgrading. Preserves state of enabled incompatible add-ons | | Downgrade to a different but compatible API version | X.2 | X.1 | Add-ons which remain incompatible are listed as incompatible on upgrading. Preserves state of enabled incompatible add-ons | diff --git a/tests/unit/test_remote/test_localMachine.py b/tests/unit/test_remote/test_localMachine.py index 93b82bd1377..da4a5bfeade 100644 --- a/tests/unit/test_remote/test_localMachine.py +++ b/tests/unit/test_remote/test_localMachine.py @@ -105,11 +105,13 @@ def _generate_parameters(self): lambda acc, val: acc if val in acc else [*acc, val], map( # Keep return values - lambda params: params - # if OpenKeyEx and QueryValueEx don't raise - if params.openKeyRaises is params.queryValueRaises is None - # Otherwise, discard the return values as they don't matter - else params._replace(valueData=None, valueType=None), + lambda params: ( + params + # if OpenKeyEx and QueryValueEx don't raise + if params.openKeyRaises is params.queryValueRaises is None + # Otherwise, discard the return values as they don't matter + else params._replace(valueData=None, valueType=None) + ), # Make Params instances out of the product of all of the possible parameter values map(CanSendSASFactors._make, product(*FACTOR_VALUES.values())), ), diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index aefdda8de94..0cf7d7bb39c 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -46,10 +46,13 @@ The triple-press keyboard shortcut (`NVDA+ctrl+r`) is not affected, as it is int ### Changes for Developers -* NVDA libraries built by the build system are now linked with the [/SETCOMPAT](https://learn.microsoft.com/en-us/cpp/build/reference/cetcompat) flag, improving protection against certain malware attacks. (#19435, @LeonarddeR) - Please refer to [the developer guide](https://download.nvaccess.org/documentation/developerGuide.html#API) for information on NVDA's API deprecation and removal process. +* Updated components: + * Python from 3.13.11 to 3.13.12. (#19572, @dpy013) + * Ruff to 0.15.4. (#19548) + * uv to 0.10.6. (#19548) +* NVDA libraries built by the build system are now linked with the [/SETCOMPAT](https://learn.microsoft.com/en-us/cpp/build/reference/cetcompat) flag, improving protection against certain malware attacks. (#19435, @LeonarddeR) * Subclasses of `browseMode.BrowseModeDocumentTreeInterceptor` that support screen layout being on and off should override the `_toggleScreenLayout` method, rather than implementing `script_toggleScreenLayout` directly. (#19487) * Clarified NV Access's policy on API breaking changes in the Developer Guide. (#19599) * The `scons tests` build target has been removed, as it was misleadingly named. diff --git a/user_docs/en/userGuide.md b/user_docs/en/userGuide.md index e25fd5db816..ee6cf7a23eb 100644 --- a/user_docs/en/userGuide.md +++ b/user_docs/en/userGuide.md @@ -1,3 +1,5 @@ + + # NVDA NVDA_VERSION User Guide [TOC] diff --git a/uv.lock b/uv.lock index 94bdf8e791b..3f9a7625015 100644 --- a/uv.lock +++ b/uv.lock @@ -44,11 +44,11 @@ wheels = [ [[package]] name = "babel" -version = "2.17.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] @@ -62,11 +62,11 @@ wheels = [ [[package]] name = "cachetools" -version = "6.2.4" +version = "7.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/1d/ede8680603f6016887c062a2cf4fc8fdba905866a3ab8831aa8aa651320c/cachetools-6.2.4.tar.gz", hash = "sha256:82c5c05585e70b6ba2d3ae09ea60b79548872185d2f24ae1f2709d37299fd607", size = 31731, upload-time = "2025-12-15T18:24:53.744Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/07/56595285564e90777d758ebd383d6b0b971b87729bbe2184a849932a3736/cachetools-7.0.1.tar.gz", hash = "sha256:e31e579d2c5b6e2944177a0397150d312888ddf4e16e12f1016068f0c03b8341", size = 36126, upload-time = "2026-02-10T22:24:05.03Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/fc/1d7b80d0eb7b714984ce40efc78859c022cd930e402f599d8ca9e39c78a4/cachetools-6.2.4-py3-none-any.whl", hash = "sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51", size = 11551, upload-time = "2025-12-15T18:24:52.332Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9e/5faefbf9db1db466d633735faceda1f94aa99ce506ac450d232536266b32/cachetools-7.0.1-py3-none-any.whl", hash = "sha256:8f086515c254d5664ae2146d14fc7f65c9a4bce75152eb247e5a9c5e6d7b2ecf", size = 13484, upload-time = "2026-02-10T22:24:03.741Z" }, ] [[package]] @@ -83,11 +83,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.1.4" +version = "2026.2.25" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, ] [[package]] @@ -227,11 +227,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.20.3" +version = "3.24.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/92/a8e2479937ff39185d20dd6a851c1a63e55849e447a55e798cc2e1f49c65/filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa", size = 37935, upload-time = "2026-02-19T00:48:20.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, + { url = "https://files.pythonhosted.org/packages/9c/0f/5d0c71a1aefeb08efff26272149e07ab922b64f46c63363756224bd6872e/filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d", size = 24331, upload-time = "2026-02-19T00:48:18.465Z" }, ] [[package]] @@ -496,24 +496,26 @@ wheels = [ [[package]] name = "nodejs-wheel-binaries" -version = "24.13.0" +version = "24.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b7/f1/73182280e2c05f49a7c2c8dbd46144efe3f74f03f798fb90da67b4a93bbf/nodejs_wheel_binaries-24.13.0.tar.gz", hash = "sha256:766aed076e900061b83d3e76ad48bfec32a035ef0d41bd09c55e832eb93ef7a4", size = 8056, upload-time = "2026-01-14T11:05:33.653Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/05/c75c0940b1ebf82975d14f37176679b6f3229eae8b47b6a70d1e1dae0723/nodejs_wheel_binaries-24.14.0.tar.gz", hash = "sha256:c87b515e44b0e4a523017d8c59f26ccbd05b54fe593338582825d4b51fc91e1c", size = 8057, upload-time = "2026-02-27T02:57:30.931Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/c3/0e13a3da78f08cb58650971a6957ac7bfef84164b405176e53ab1e3584e2/nodejs_wheel_binaries-24.13.0-py2.py3-none-win_amd64.whl", hash = "sha256:605be4763e3ef427a3385a55da5a1bcf0a659aa2716eebbf23f332926d7e5f23", size = 41345528, upload-time = "2026-01-14T11:05:27.67Z" }, - { url = "https://files.pythonhosted.org/packages/a3/f1/0578d65b4e3dc572967fd702221ea1f42e1e60accfb6b0dd8d8f15410139/nodejs_wheel_binaries-24.13.0-py2.py3-none-win_arm64.whl", hash = "sha256:2e3431d869d6b2dbeef1d469ad0090babbdcc8baaa72c01dd3cc2c6121c96af5", size = 39054688, upload-time = "2026-01-14T11:05:30.739Z" }, + { url = "https://files.pythonhosted.org/packages/60/8c/b8c5f61201c72a0c7dc694b459941f89a6defda85deff258a9940a4e2efc/nodejs_wheel_binaries-24.14.0-py2.py3-none-win_amd64.whl", hash = "sha256:60b83c4e98b0c7d836ac9ccb67dcb36e343691cbe62cd325799ff9ed936286f3", size = 41218783, upload-time = "2026-02-27T02:57:24.175Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/1f904bc9cbd8eece393e20840c08ba3ac03440090c3a4e95168fa6d2709f/nodejs_wheel_binaries-24.14.0-py2.py3-none-win_arm64.whl", hash = "sha256:78a9bd1d6b11baf1433f9fb84962ff8aa71c87d48b6434f98224bc49a2253a6e", size = 38926103, upload-time = "2026-02-27T02:57:27.458Z" }, ] [[package]] name = "numpy" -version = "2.2.6" +version = "2.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, ] [[package]] @@ -608,7 +610,7 @@ dev = [ { name = "py2exe", specifier = "==0.14.0.0" }, { name = "scons", specifier = "==4.10.1" }, { name = "setuptools", specifier = "~=80.10.2" }, - { name = "uv", specifier = "==0.9.11" }, + { name = "uv", specifier = "==0.10.6" }, ] dev-docs = [ { name = "sphinx", specifier = "==8.1.3" }, @@ -618,7 +620,7 @@ license-check = [{ name = "licensecheck", specifier = "==2025.1" }] lint = [ { name = "pre-commit", specifier = "==4.2.0" }, { name = "pyright", extras = ["nodejs"], specifier = "==1.1.407" }, - { name = "ruff", specifier = "==0.14.5" }, + { name = "ruff", specifier = "==0.15.4" }, ] system-tests = [ { name = "robotframework", specifier = "==7.3.2" }, @@ -642,24 +644,23 @@ source = { editable = "miscDeps" } [[package]] name = "opencv-python" -version = "4.12.0.88" +version = "4.13.0.92" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/71/25c98e634b6bdeca4727c7f6d6927b056080668c5008ad3c8fc9e7f8f6ec/opencv-python-4.12.0.88.tar.gz", hash = "sha256:8b738389cede219405f6f3880b851efa3415ccd674752219377353f017d2994d", size = 95373294, upload-time = "2025-07-07T09:20:52.389Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/96/213fea371d3cb2f1d537612a105792aa0a6659fb2665b22cad709a75bd94/opencv_python-4.12.0.88-cp37-abi3-win32.whl", hash = "sha256:ff554d3f725b39878ac6a2e1fa232ec509c36130927afc18a1719ebf4fbf4357", size = 30284131, upload-time = "2025-07-07T09:14:08.819Z" }, - { url = "https://files.pythonhosted.org/packages/fa/80/eb88edc2e2b11cd2dd2e56f1c80b5784d11d6e6b7f04a1145df64df40065/opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl", hash = "sha256:d98edb20aa932fd8ebd276a72627dad9dc097695b3d435a4257557bbb49a79d2", size = 39000307, upload-time = "2025-07-07T09:14:16.641Z" }, + { url = "https://files.pythonhosted.org/packages/fb/17/de5458312bcb07ddf434d7bfcb24bb52c59635ad58c6e7c751b48949b009/opencv_python-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:372fe164a3148ac1ca51e5f3ad0541a4a276452273f503441d718fab9c5e5f59", size = 30932638, upload-time = "2026-02-05T07:02:14.98Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a5/1be1516390333ff9be3a9cb648c9f33df79d5096e5884b5df71a588af463/opencv_python-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:423d934c9fafb91aad38edf26efb46da91ffbc05f3f59c4b0c72e699720706f5", size = 40212062, upload-time = "2026-02-05T07:02:12.724Z" }, ] [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] @@ -699,11 +700,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.5.1" +version = "4.9.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/04/fea538adf7dbbd6d186f551d595961e564a3b6715bdf276b477460858672/platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291", size = 28394, upload-time = "2026-02-16T03:56:10.574Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, + { url = "https://files.pythonhosted.org/packages/48/31/05e764397056194206169869b50cf2fee4dbbbc71b344705b9c0d878d4d8/platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd", size = 21168, upload-time = "2026-02-16T03:56:08.891Z" }, ] [[package]] @@ -736,14 +737,14 @@ wheels = [ [[package]] name = "psutil" -version = "7.2.1" +version = "7.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, - { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, - { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] [[package]] @@ -787,11 +788,11 @@ wheels = [ [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -882,6 +883,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, ] +[[package]] +name = "python-discovery" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock", marker = "sys_platform == 'win32'" }, + { name = "platformdirs", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/bb/93a3e83bdf9322c7e21cafd092e56a4a17c4d8ef4277b6eb01af1a540a6f/python_discovery-1.1.0.tar.gz", hash = "sha256:447941ba1aed8cc2ab7ee3cb91be5fc137c5bdbb05b7e6ea62fbdcb66e50b268", size = 55674, upload-time = "2026-02-26T09:42:49.668Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/54/82a6e2ef37f0f23dccac604b9585bdcbd0698604feb64807dcb72853693e/python_discovery-1.1.0-py3-none-any.whl", hash = "sha256:a162893b8809727f54594a99ad2179d2ede4bf953e12d4c7abc3cc9cdbd1437b", size = 30687, upload-time = "2026-02-26T09:42:48.548Z" }, +] + [[package]] name = "pytweening" version = "1.2.0" @@ -926,7 +940,7 @@ wheels = [ [[package]] name = "requests-cache" -version = "1.2.1" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs", marker = "sys_platform == 'win32'" }, @@ -936,9 +950,9 @@ dependencies = [ { name = "url-normalize", marker = "sys_platform == 'win32'" }, { name = "urllib3", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/be/7b2a95a9e7a7c3e774e43d067c51244e61dea8b120ae2deff7089a93fb2b/requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1", size = 3018209, upload-time = "2024-06-18T17:18:03.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/6c/deaf1a9462ce8b6a9ac0ee3603d9ba32917be8e48c8f6799770d5418c3cb/requests_cache-1.3.0.tar.gz", hash = "sha256:070e357ccef11a300ccef4294a85de1ab265833c5d9c9538b26cd7ba4085d54a", size = 97720, upload-time = "2026-02-02T23:17:33.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/2e/8f4051119f460cfc786aa91f212165bb6e643283b533db572d7b33952bd2/requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603", size = 61425, upload-time = "2024-06-18T17:17:45Z" }, + { url = "https://files.pythonhosted.org/packages/68/3f/dfa42bb16be96d53351aa151cb1e39fcaafe6cda01389c530a2ec809ef8a/requests_cache-1.3.0-py3-none-any.whl", hash = "sha256:f09f27bbf100c250886acf13a9db35b53cf2852fddd71977b47c71ea7d90dbba", size = 69626, upload-time = "2026-02-02T23:17:31.718Z" }, ] [[package]] @@ -955,15 +969,15 @@ wheels = [ [[package]] name = "rich" -version = "14.2.0" +version = "14.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", marker = "sys_platform == 'win32'" }, { name = "pygments", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/c6/f3b320c27991c46f43ee9d856302c70dc2d0fb2dba4842ff739d5f46b393/rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b", size = 230582, upload-time = "2026-02-19T17:23:12.474Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] [[package]] @@ -1012,13 +1026,13 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.5" +version = "0.15.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/fa/fbb67a5780ae0f704876cb8ac92d6d76da41da4dc72b7ed3565ab18f2f52/ruff-0.14.5.tar.gz", hash = "sha256:8d3b48d7d8aad423d3137af7ab6c8b1e38e4de104800f0d596990f6ada1a9fc1", size = 5615944, upload-time = "2025-11-13T19:58:51.155Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/31/d6e536cdebb6568ae75a7f00e4b4819ae0ad2640c3604c305a0428680b0c/ruff-0.15.4.tar.gz", hash = "sha256:3412195319e42d634470cc97aa9803d07e9d5c9223b99bcb1518f0c725f26ae1", size = 4569550, upload-time = "2026-02-26T20:04:14.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/f1/7119e42aa1d3bf036ffc9478885c2e248812b7de9abea4eae89163d2929d/ruff-0.14.5-py3-none-win32.whl", hash = "sha256:c83642e6fccfb6dea8b785eb9f456800dcd6a63f362238af5fc0c83d027dd08b", size = 12925808, upload-time = "2025-11-13T19:58:42.779Z" }, - { url = "https://files.pythonhosted.org/packages/3b/9d/7c0a255d21e0912114784e4a96bf62af0618e2190cae468cd82b13625ad2/ruff-0.14.5-py3-none-win_amd64.whl", hash = "sha256:9d55d7af7166f143c94eae1db3312f9ea8f95a4defef1979ed516dbb38c27621", size = 14331546, upload-time = "2025-11-13T19:58:45.691Z" }, - { url = "https://files.pythonhosted.org/packages/e5/80/69756670caedcf3b9be597a6e12276a6cf6197076eb62aad0c608f8efce0/ruff-0.14.5-py3-none-win_arm64.whl", hash = "sha256:4b700459d4649e2594b31f20a9de33bc7c19976d4746d8d0798ad959621d64a4", size = 13433331, upload-time = "2025-11-13T19:58:48.434Z" }, + { url = "https://files.pythonhosted.org/packages/1b/fa/2ef715a1cd329ef47c1a050e10dee91a9054b7ce2fcfdd6a06d139afb7ec/ruff-0.15.4-py3-none-win32.whl", hash = "sha256:65594a2d557d4ee9f02834fcdf0a28daa8b3b9f6cb2cb93846025a36db47ef22", size = 10506664, upload-time = "2026-02-26T20:03:50.56Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a8/c688ef7e29983976820d18710f955751d9f4d4eb69df658af3d006e2ba3e/ruff-0.15.4-py3-none-win_amd64.whl", hash = "sha256:04196ad44f0df220c2ece5b0e959c2f37c777375ec744397d21d15b50a75264f", size = 11651048, upload-time = "2026-02-26T20:04:17.191Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0a/9e1be9035b37448ce2e68c978f0591da94389ade5a5abafa4cf99985d1b2/ruff-0.15.4-py3-none-win_arm64.whl", hash = "sha256:60d5177e8cfc70e51b9c5fad936c634872a74209f934c1e79107d11787ad5453", size = 10966776, upload-time = "2026-02-26T20:03:56.908Z" }, ] [[package]] @@ -1220,27 +1234,28 @@ wheels = [ [[package]] name = "uv" -version = "0.9.11" +version = "0.10.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/08/3bf76403ea7c22feef634849137fab10b28ab5ba5bbf08a53390763d5448/uv-0.9.11.tar.gz", hash = "sha256:605a7a57f508aabd029fc0c5ef5c60a556f8c50d32e194f1a300a9f4e87f18d4", size = 3744387, upload-time = "2025-11-20T23:20:00.95Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/53/7a4274dad70b1d17efb99e36d45fc1b5e4e1e531b43247e518604394c761/uv-0.10.6.tar.gz", hash = "sha256:de86e5e1eb264e74a20fccf56889eea2463edb5296f560958e566647c537b52e", size = 3921763, upload-time = "2026-02-25T00:26:27.066Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/4d/bfd41bf087522601c724d712c3727aeb62f51b1f67c4ab86a078c3947525/uv-0.9.11-py3-none-win32.whl", hash = "sha256:af5fd91eecaa04b4799f553c726307200f45da844d5c7c5880d64db4debdd5dc", size = 19639246, upload-time = "2025-11-20T23:19:50.254Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2f/d51c02627de68a7ca5b82f0a5d61d753beee3fe696366d1a1c5d5e40cd58/uv-0.9.11-py3-none-win_amd64.whl", hash = "sha256:c65a024ad98547e32168f3a52360fe73ff39cd609a8fb9dd2509aac91483cfc8", size = 21626822, upload-time = "2025-11-20T23:19:54.424Z" }, - { url = "https://files.pythonhosted.org/packages/af/d8/e07e866ee328d3c9f27a6d57a018d8330f47be95ef4654a178779c968a66/uv-0.9.11-py3-none-win_arm64.whl", hash = "sha256:4907a696c745703542ed2559bdf5380b92c8b1d4bf290ebfed45bf9a2a2c6690", size = 20046856, upload-time = "2025-11-20T23:19:58.517Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e3/e000030118ff1a82ecfc6bd5af70949821edac739975a027994f5b17258f/uv-0.10.6-py3-none-win32.whl", hash = "sha256:fa7c504a1e16713b845d457421b07dd9c40f40d911ffca6897f97388de49df5a", size = 21501863, upload-time = "2026-02-25T00:26:57.182Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/dd88c9f20c054ef0aea84ad1dd9f8b547463824857e4376463a948983bed/uv-0.10.6-py3-none-win_amd64.whl", hash = "sha256:ecded4d21834b21002bc6e9a2628d21f5c8417fd77a5db14250f1101bcb69dac", size = 23981891, upload-time = "2026-02-25T00:26:38.773Z" }, + { url = "https://files.pythonhosted.org/packages/cf/06/ca117002cd64f6701359253d8566ec7a0edcf61715b4969f07ee41d06f61/uv-0.10.6-py3-none-win_arm64.whl", hash = "sha256:4b5688625fc48565418c56a5cd6c8c32020dbb7c6fb7d10864c2d2c93c508302", size = 22339889, upload-time = "2026-02-25T00:27:00.818Z" }, ] [[package]] name = "virtualenv" -version = "20.36.1" +version = "21.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib", marker = "sys_platform == 'win32'" }, { name = "filelock", marker = "sys_platform == 'win32'" }, { name = "platformdirs", marker = "sys_platform == 'win32'" }, + { name = "python-discovery", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/4f/d6a5ff3b020c801c808b14e2d2330cdc8ebefe1cdfbc457ecc368e971fec/virtualenv-21.0.0.tar.gz", hash = "sha256:e8efe4271b4a5efe7a4dce9d60a05fd11859406c0d6aa8464f4cf451bc132889", size = 5836591, upload-time = "2026-02-25T20:21:07.691Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, + { url = "https://files.pythonhosted.org/packages/29/d1/3f62e4f9577b28c352c11623a03fb916096d5c131303d4861b4914481b6b/virtualenv-21.0.0-py3-none-any.whl", hash = "sha256:d44e70637402c7f4b10f48491c02a6397a3a187152a70cba0b6bc7642d69fb05", size = 5817167, upload-time = "2026-02-25T20:21:05.476Z" }, ] [[package]] @@ -1254,17 +1269,17 @@ wheels = [ [[package]] name = "wrapt" -version = "2.0.1" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/37/ae31f40bec90de2f88d9597d0b5281e23ffe85b893a47ca5d9c05c63a4f6/wrapt-2.1.1.tar.gz", hash = "sha256:5fdcb09bf6db023d88f312bd0767594b414655d58090fc1c46b3414415f67fac", size = 81329, upload-time = "2026-02-03T02:12:13.786Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/7b/38df30fd629fbd7612c407643c63e80e1c60bcc982e30ceeae163a9800e7/wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7", size = 58252, upload-time = "2025-11-07T00:44:17.814Z" }, - { url = "https://files.pythonhosted.org/packages/85/64/d3954e836ea67c4d3ad5285e5c8fd9d362fd0a189a2db622df457b0f4f6a/wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3", size = 60500, upload-time = "2025-11-07T00:44:15.561Z" }, - { url = "https://files.pythonhosted.org/packages/89/4e/3c8b99ac93527cfab7f116089db120fef16aac96e5f6cdb724ddf286086d/wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8", size = 58993, upload-time = "2025-11-07T00:44:16.65Z" }, - { url = "https://files.pythonhosted.org/packages/bb/b6/20ffcf2558596a7f58a2e69c89597128781f0b88e124bf5a4cadc05b8139/wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c", size = 59943, upload-time = "2025-11-07T00:44:33.211Z" }, - { url = "https://files.pythonhosted.org/packages/87/6a/0e56111cbb3320151eed5d3821ee1373be13e05b376ea0870711f18810c3/wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92", size = 63240, upload-time = "2025-11-07T00:44:30.935Z" }, - { url = "https://files.pythonhosted.org/packages/1d/54/5ab4c53ea1f7f7e5c3e7c1095db92932cc32fd62359d285486d00c2884c3/wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f", size = 60416, upload-time = "2025-11-07T00:44:32.002Z" }, - { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, + { url = "https://files.pythonhosted.org/packages/55/90/65be41e40845d951f714b5a77e84f377a3787b1e8eee6555a680da6d0db5/wrapt-2.1.1-cp313-cp313-win32.whl", hash = "sha256:0bb7207130ce6486727baa85373503bf3334cc28016f6928a0fa7e19d7ecdc06", size = 58090, upload-time = "2026-02-03T02:12:53.342Z" }, + { url = "https://files.pythonhosted.org/packages/5f/66/6a09e0294c4fc8c26028a03a15191721c9271672467cc33e6617ee0d91d2/wrapt-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:cbfee35c711046b15147b0ae7db9b976f01c9520e6636d992cd9e69e5e2b03b1", size = 60341, upload-time = "2026-02-03T02:12:36.384Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f0/20ceb8b701e9a71555c87a5ddecbed76ec16742cf1e4b87bbaf26735f998/wrapt-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:7d2756061022aebbf57ba14af9c16e8044e055c22d38de7bf40d92b565ecd2b0", size = 58731, upload-time = "2026-02-03T02:12:01.328Z" }, + { url = "https://files.pythonhosted.org/packages/38/ec/67c90a7082f452964b4621e4890e9a490f1add23cdeb7483cc1706743291/wrapt-2.1.1-cp313-cp313t-win32.whl", hash = "sha256:b8af75fe20d381dd5bcc9db2e86a86d7fcfbf615383a7147b85da97c1182225b", size = 59783, upload-time = "2026-02-03T02:11:39.863Z" }, + { url = "https://files.pythonhosted.org/packages/ec/08/466afe4855847d8febdfa2c57c87e991fc5820afbdef01a273683dfd15a0/wrapt-2.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:45c5631c9b6c792b78be2d7352129f776dd72c605be2c3a4e9be346be8376d83", size = 63082, upload-time = "2026-02-03T02:12:09.075Z" }, + { url = "https://files.pythonhosted.org/packages/9a/62/60b629463c28b15b1eeadb3a0691e17568622b12aa5bfa7ebe9b514bfbeb/wrapt-2.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:da815b9263947ac98d088b6414ac83507809a1d385e4632d9489867228d6d81c", size = 60251, upload-time = "2026-02-03T02:11:21.794Z" }, + { url = "https://files.pythonhosted.org/packages/c4/da/5a086bf4c22a41995312db104ec2ffeee2cf6accca9faaee5315c790377d/wrapt-2.1.1-py3-none-any.whl", hash = "sha256:3b0f4629eb954394a3d7c7a1c8cca25f0b07cefe6aa8545e862e9778152de5b7", size = 43886, upload-time = "2026-02-03T02:11:45.048Z" }, ] [[package]]