From d855c55714ef287497b4e89321bc5ec071ba483e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:54:23 +0000 Subject: [PATCH 1/2] Pre-commit auto-update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0) - [github.com/asottile/add-trailing-comma: v3.2.0 → v4.0.0](https://github.com/asottile/add-trailing-comma/compare/v3.2.0...v4.0.0) - [github.com/astral-sh/ruff-pre-commit: v0.12.7 → v0.16.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.7...v0.16.1) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 207177d..95ef7b2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,7 +26,7 @@ repos: - id: check-hooks-apply - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: # Prevents commits to certain branches - id: no-commit-to-branch @@ -60,7 +60,7 @@ repos: # Avoids using reserved Windows filenames. - id: check-illegal-windows-names - repo: https://github.com/asottile/add-trailing-comma - rev: v3.2.0 + rev: v4.0.0 hooks: # Ruff preserves indent/new-line formatting of function arguments, list items, and similar iterables, # if a trailing comma is added. @@ -69,7 +69,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Matches Ruff version in pyproject. - rev: v0.12.7 + rev: v0.16.1 hooks: - id: ruff name: lint with ruff From 918dc20dbc5d4473e1951e8532f8479b72d085d7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:54:32 +0000 Subject: [PATCH 2/2] Pre-commit auto-fix --- .github/scripts/checkTranslation.py | 3 +- .github/workflows/manual-release.yaml | 2 +- addon/globalPlugins/askOpenRouter/__init__.py | 12 +-- addon/globalPlugins/askOpenRouter/dialogs.py | 18 +++-- .../globalPlugins/askOpenRouter/functions.py | 54 ++++++------- site_scons/site_tools/NVDATool/__init__.py | 78 ++++++++++--------- site_scons/site_tools/NVDATool/addon.py | 2 +- site_scons/site_tools/NVDATool/manifests.py | 2 +- site_scons/site_tools/NVDATool/typings.py | 2 +- 9 files changed, 94 insertions(+), 79 deletions(-) diff --git a/.github/scripts/checkTranslation.py b/.github/scripts/checkTranslation.py index 9d03dc6..df12632 100644 --- a/.github/scripts/checkTranslation.py +++ b/.github/scripts/checkTranslation.py @@ -2,8 +2,9 @@ # This file is covered by the GNU General Public License. # See the file COPYING for more details. -import sys import os +import sys + from crowdin_api import CrowdinClient diff --git a/.github/workflows/manual-release.yaml b/.github/workflows/manual-release.yaml index 71ccd2c..c72fcdc 100644 --- a/.github/workflows/manual-release.yaml +++ b/.github/workflows/manual-release.yaml @@ -44,7 +44,7 @@ jobs: $curDate = Get-Date -Format "yyyyMMdd" $curYear = Get-Date -Format "yyyy" $tagName = "v" + (Get-Date -Format "yy.MM.dd") - + echo "CUR_DATE=$curDate" >> $env:GITHUB_ENV echo "CUR_YEAR=$curYear" >> $env:GITHUB_ENV echo "TAG_NAME=$tagName" >> $env:GITHUB_ENV diff --git a/addon/globalPlugins/askOpenRouter/__init__.py b/addon/globalPlugins/askOpenRouter/__init__.py index 42f04c3..1090010 100644 --- a/addon/globalPlugins/askOpenRouter/__init__.py +++ b/addon/globalPlugins/askOpenRouter/__init__.py @@ -5,15 +5,17 @@ # This file is covered by the GNU General Public License. # See the file COPYING for more details. -import scriptHandler -import config -import wx +from collections.abc import Callable + import addonHandler +import config import globalPluginHandler import gui -from typing import Callable -from .dialogs import addonSummary, OpenRouterSettingsPanel, ChatDialog +import scriptHandler +import wx from gui.settingsDialogs import NVDASettingsDialog + +from .dialogs import ChatDialog, OpenRouterSettingsPanel, addonSummary from .functions import disableInSecureMode addonHandler.initTranslation() diff --git a/addon/globalPlugins/askOpenRouter/dialogs.py b/addon/globalPlugins/askOpenRouter/dialogs.py index 99582c0..281c578 100644 --- a/addon/globalPlugins/askOpenRouter/dialogs.py +++ b/addon/globalPlugins/askOpenRouter/dialogs.py @@ -3,14 +3,16 @@ # Copyright(C) 2026-2028 Abdel # Released under GPL 2 -import wx +from collections.abc import Callable +from typing import Optional, cast + import addonHandler import config import gui -from typing import Callable, List, Dict, Optional, cast - +import wx from gui.settingsDialogs import SettingsPanel -from .functions import askOpenRouter, inputBox, getAvailableModels + +from .functions import askOpenRouter, getAvailableModels, inputBox addonHandler.initTranslation() @@ -235,7 +237,7 @@ def makeSettings(self, settingsSizer: wx.Sizer) -> None: self.sHelper.addItem(self.modelsList, flag=wx.EXPAND) self.modelsList.Hide() - self.modelsData: List[Dict[str, object]] = [] + self.modelsData: list[dict[str, object]] = [] wx.CallAfter(self.onToggleModelsList, None) @@ -256,7 +258,7 @@ def onToggleApiVisibility(self, evt: wx.CommandEvent) -> None: self.Layout() - def onToggleModelsList(self, evt: Optional[wx.CommandEvent]) -> None: + def onToggleModelsList(self, evt: wx.CommandEvent | None) -> None: """ Show or hide the models list depending on checkbox state. """ @@ -286,7 +288,7 @@ def _loadModelsIfNeeded(self) -> None: return try: - models: List[Dict[str, object]] = getAvailableModels(apiKey) + models: list[dict[str, object]] = getAvailableModels(apiKey) except Exception: return @@ -294,7 +296,7 @@ def _loadModelsIfNeeded(self) -> None: self.modelsData = models - displayNames: List[str] = [] + displayNames: list[str] = [] for m in models: price: float = cast(float, m["promptPricing"]) diff --git a/addon/globalPlugins/askOpenRouter/functions.py b/addon/globalPlugins/askOpenRouter/functions.py index 6003b94..b6b5f71 100644 --- a/addon/globalPlugins/askOpenRouter/functions.py +++ b/addon/globalPlugins/askOpenRouter/functions.py @@ -5,22 +5,24 @@ # This file is covered by the GNU General Public License. # See the file COPYING for more details. -import wx -import globalPluginHandler -import globalVars +import json import os -import addonHandler import pickle import random -import markdown -import json +import time +import urllib.error +import urllib.request +from collections.abc import Callable +from typing import Any + +import addonHandler import config -import ui +import globalPluginHandler +import globalVars import gui -import urllib.request -import urllib.error -import time -from typing import List, Dict, Callable, Optional, Any +import markdown +import ui +import wx addonHandler.initTranslation() @@ -28,7 +30,7 @@ _: Callable[[str], str] # Temporary in-memory blacklist for unavailable models -_unavailableModels: Dict[str, float] = {} +_unavailableModels: dict[str, float] = {} # Cooldowns (seconds) _RATE_LIMIT_COOLDOWN: int = 300 # 429 @@ -76,7 +78,7 @@ def loadModel(filename: str) -> str: return "" -def saveHistory(history: List[Dict[str, str]], filename: str) -> None: +def saveHistory(history: list[dict[str, str]], filename: str) -> None: """ Serialize and save conversation history to disk. @@ -91,7 +93,7 @@ def saveHistory(history: List[Dict[str, str]], filename: str) -> None: pickle.dump(history, f) -def loadHistory(filename: str) -> List[Dict[str, str]]: +def loadHistory(filename: str) -> list[dict[str, str]]: """ Load serialized conversation history from disk. @@ -171,7 +173,7 @@ def getRandomFreeModel(apiKey: str) -> str: modelsURL: str = "https://openrouter.ai/api/v1/models" - headers: Dict[str, str] = { + headers: dict[str, str] = { "Authorization": f"Bearer {apiKey}", "User-Agent": "Python-urllib", } @@ -183,7 +185,7 @@ def getRandomFreeModel(apiKey: str) -> str: models = data["data"] - candidates: List[str] = [ + candidates: list[str] = [ m["id"] for m in models if float(m.get("pricing", {}).get("prompt", 1)) == 0 @@ -201,7 +203,7 @@ def getRandomFreeModel(apiKey: str) -> str: return random.choice(candidates) -def getAvailableModels(apiKey: str) -> List[Dict[str, object]]: +def getAvailableModels(apiKey: str) -> list[dict[str, object]]: """ Retrieve the full list of available models for the current user. @@ -232,7 +234,7 @@ def getAvailableModels(apiKey: str) -> List[Dict[str, object]]: """ modelsURL: str = "https://openrouter.ai/api/v1/models" - headers: Dict[str, str] = { + headers: dict[str, str] = { "Authorization": f"Bearer {apiKey}", "User-Agent": "Python-urllib", } @@ -244,7 +246,7 @@ def getAvailableModels(apiKey: str) -> List[Dict[str, object]]: models = data.get("data", []) - availableModels: List[Dict[str, object]] = [] + availableModels: list[dict[str, object]] = [] for m in models: if m.get("deprecated", False): @@ -266,7 +268,7 @@ def getAvailableModels(apiKey: str) -> List[Dict[str, object]]: return availableModels -def _sendRequest(url: str, headers: Dict[str, str], data: Dict) -> str: +def _sendRequest(url: str, headers: dict[str, str], data: dict) -> str: """ Send an HTTP POST request to OpenRouter. @@ -326,8 +328,8 @@ def getHistory(filename: str) -> str: str: HTML-formatted conversation history, or an empty string if no history exists. """ - historyLines: List[str] = [] - allChat: List[Dict[str, str]] = [] + historyLines: list[str] = [] + allChat: list[dict[str, str]] = [] # Translators: Message announcing what the user said. userQuestion: str = _("You said:") # Translators: Message announcing what the model responded. @@ -427,7 +429,7 @@ def askOpenRouter(prompt: str, apiKey: str, new: bool = True) -> None: ) return - history: List[Dict[str, str]] = loadHistory(historyFile) + history: list[dict[str, str]] = loadHistory(historyFile) history.append( { @@ -436,21 +438,21 @@ def askOpenRouter(prompt: str, apiKey: str, new: bool = True) -> None: }, ) - headers: Dict[str, str] = { + headers: dict[str, str] = { "Authorization": f"Bearer {apiKey}", "Content-Type": "application/json", "HTTP-Referer": "http://localhost", "X-Title": "My question", } - data: Dict[str, Any] = { + data: dict[str, Any] = { "model": model, "messages": history, } maxAttempts: int = 5 attempt: int = 0 - answer: Optional[str] = None + answer: str | None = None while attempt < maxAttempts: try: diff --git a/site_scons/site_tools/NVDATool/__init__.py b/site_scons/site_tools/NVDATool/__init__.py index a71857d..1bee61e 100644 --- a/site_scons/site_tools/NVDATool/__init__.py +++ b/site_scons/site_tools/NVDATool/__init__.py @@ -23,23 +23,25 @@ """ -from SCons.Script import Environment, Builder +from SCons.Script import Builder, Environment from .addon import createAddonBundleFromPath -from .manifests import generateManifest, generateTranslatedManifest from .docs import md2html +from .manifests import generateManifest, generateTranslatedManifest def generate(env: Environment): env.SetDefault(excludePatterns=tuple()) addonAction = env.Action( - lambda target, source, env: createAddonBundleFromPath( - source[0].abspath, - target[0].abspath, - env["excludePatterns"], - ) - and None, + lambda target, source, env: ( + createAddonBundleFromPath( + source[0].abspath, + target[0].abspath, + env["excludePatterns"], + ) + and None + ), lambda target, source, env: f"Generating Addon {target[0]}", ) env["BUILDERS"]["NVDAAddon"] = Builder( @@ -53,15 +55,17 @@ def generate(env: Environment): env.SetDefault(speechDictionaries={}) manifestAction = env.Action( - lambda target, source, env: generateManifest( - source[0].abspath, - target[0].abspath, - addon_info=env["addon_info"], - brailleTables=env["brailleTables"], - symbolDictionaries=env["symbolDictionaries"], - speechDictionaries=env["speechDictionaries"], - ) - and None, + lambda target, source, env: ( + generateManifest( + source[0].abspath, + target[0].abspath, + addon_info=env["addon_info"], + brailleTables=env["brailleTables"], + symbolDictionaries=env["symbolDictionaries"], + speechDictionaries=env["speechDictionaries"], + ) + and None + ), lambda target, source, env: f"Generating manifest {target[0]}", ) env["BUILDERS"]["NVDAManifest"] = Builder( @@ -71,16 +75,18 @@ def generate(env: Environment): ) translatedManifestAction = env.Action( - lambda target, source, env: generateTranslatedManifest( - source[1].abspath, - target[0].abspath, - mo=source[0].abspath, - addon_info=env["addon_info"], - brailleTables=env["brailleTables"], - symbolDictionaries=env["symbolDictionaries"], - speechDictionaries=env["speechDictionaries"], - ) - and None, + lambda target, source, env: ( + generateTranslatedManifest( + source[1].abspath, + target[0].abspath, + mo=source[0].abspath, + addon_info=env["addon_info"], + brailleTables=env["brailleTables"], + symbolDictionaries=env["symbolDictionaries"], + speechDictionaries=env["speechDictionaries"], + ) + and None + ), lambda target, source, env: f"Generating translated manifest {target[0]}", ) @@ -93,14 +99,16 @@ def generate(env: Environment): env.SetDefault(mdExtensions={}) mdAction = env.Action( - lambda target, source, env: md2html( - source[0].path, - target[0].path, - moFile=env["moFile"].path if env["moFile"] else None, - mdExtensions=env["mdExtensions"], - addon_info=env["addon_info"], - ) - and None, + lambda target, source, env: ( + md2html( + source[0].path, + target[0].path, + moFile=env["moFile"].path if env["moFile"] else None, + mdExtensions=env["mdExtensions"], + addon_info=env["addon_info"], + ) + and None + ), lambda target, source, env: f"Generating {target[0]}", ) env["BUILDERS"]["md2html"] = env.Builder( diff --git a/site_scons/site_tools/NVDATool/addon.py b/site_scons/site_tools/NVDATool/addon.py index 7d67516..ee1fc5a 100644 --- a/site_scons/site_tools/NVDATool/addon.py +++ b/site_scons/site_tools/NVDATool/addon.py @@ -5,7 +5,7 @@ def matchesNoPatterns(path: Path, patterns: Iterable[str]) -> bool: """Checks if the path, the first argument, does not match any of the patterns passed as the second argument.""" - return not any((path.match(pattern) for pattern in patterns)) + return not any(path.match(pattern) for pattern in patterns) def createAddonBundleFromPath(path: str | Path, dest: str, excludePatterns: Iterable[str]): diff --git a/site_scons/site_tools/NVDATool/manifests.py b/site_scons/site_tools/NVDATool/manifests.py index 7723b0b..edd97b2 100644 --- a/site_scons/site_tools/NVDATool/manifests.py +++ b/site_scons/site_tools/NVDATool/manifests.py @@ -2,7 +2,7 @@ import gettext from functools import partial -from .typings import AddonInfo, BrailleTables, SymbolDictionaries, SpeechDictionaries +from .typings import AddonInfo, BrailleTables, SpeechDictionaries, SymbolDictionaries from .utils import format_nested_section diff --git a/site_scons/site_tools/NVDATool/typings.py b/site_scons/site_tools/NVDATool/typings.py index 0375538..009c2f3 100644 --- a/site_scons/site_tools/NVDATool/typings.py +++ b/site_scons/site_tools/NVDATool/typings.py @@ -1,4 +1,4 @@ -from typing import TypedDict, Protocol +from typing import Protocol, TypedDict class AddonInfo(TypedDict):