diff --git a/lib/licenses.nix b/lib/licenses.nix index e024ee13fe37..416891232e84 100644 --- a/lib/licenses.nix +++ b/lib/licenses.nix @@ -975,6 +975,11 @@ lib.mapAttrs mkLicense ( fullName = "libtiff License"; }; + liliq-p-11 = { + spdxId = "LiLiQ-P-1.1"; + fullName = "Licence Libre du Québec – Permissive version 1.1"; + }; + llgpl21 = { fullName = "Lisp LGPL; GNU Lesser General Public License version 2.1 with Franz Inc. preamble for clarification of LGPL terms in context of Lisp"; url = "https://opensource.franz.com/preamble.html"; diff --git a/nixos/tests/home-assistant.nix b/nixos/tests/home-assistant.nix index 55664bfa0d79..17e90ac7b6c7 100644 --- a/nixos/tests/home-assistant.nix +++ b/nixos/tests/home-assistant.nix @@ -77,11 +77,10 @@ in # configure the recorder component to use the postgresql db recorder.db_url = "postgresql://@/hass"; - # we can't load default_config, because the updater requires - # network access and would cause an error, so load frontend - # here explicitly. - # https://www.home-assistant.io/integrations/frontend/ - frontend = { }; + # without these some components that are loaded anyway fail to find + # their dependencies + default_config = { }; + infrared = { }; # include some popular integrations, that absolutely shouldn't break knx = { }; @@ -288,7 +287,7 @@ in wait_for_homeassistant(cursor) with subtest("Check that no errors were logged"): - hass.fail("journalctl -u home-assistant -o cat | grep -q ERROR") + hass.fail("journalctl -u home-assistant -o cat | grep -q 'ERROR ('") with subtest("Check systemd unit hardening"): hass.log(hass.succeed("systemctl cat home-assistant.service")) diff --git a/pkgs/applications/networking/cluster/terraform-providers/providers.json b/pkgs/applications/networking/cluster/terraform-providers/providers.json index 4a817456a801..6213df3e4cb3 100644 --- a/pkgs/applications/networking/cluster/terraform-providers/providers.json +++ b/pkgs/applications/networking/cluster/terraform-providers/providers.json @@ -1130,13 +1130,13 @@ "vendorHash": "sha256-33NOGIvqLpgndG68GxAeoiISjWV7ApR4jmvqyZHjPKo=" }, "rootlyhq_rootly": { - "hash": "sha256-iNWJBv9idm0BUIeP7HScQP8MtWdyJCUF4p1EdRvgE98=", + "hash": "sha256-OTXTCAeKsDtjtOqM6gP2/D1D5ZNblqf/1VtnZoEYNNI=", "homepage": "https://registry.terraform.io/providers/rootlyhq/rootly", "owner": "rootlyhq", "repo": "terraform-provider-rootly", - "rev": "v5.7.0", + "rev": "v5.10.0", "spdx": "MPL-2.0", - "vendorHash": "sha256-UyfCHBSdGKCulExhUdYfvEab8cVjaHGDfgslRS0d1Co=" + "vendorHash": "sha256-b4hzgQeuOZ5mruSZGIR9iImiVhmLnFlFSQr1RUTDx8E=" }, "rundeck_rundeck": { "hash": "sha256-g8unbz8+UGLiAOJju6E2bLkygvZgHkv173PdMDefmrc=", diff --git a/pkgs/by-name/co/convoyeur/package.nix b/pkgs/by-name/co/convoyeur/package.nix new file mode 100644 index 000000000000..f9406551c0f5 --- /dev/null +++ b/pkgs/by-name/co/convoyeur/package.nix @@ -0,0 +1,30 @@ +{ + lib, + rustPlatform, + fetchFromCodeberg, + nix-update-script, +}: + +rustPlatform.buildRustPackage rec { + pname = "convoyeur"; + version = "0.1.1"; + + src = fetchFromCodeberg { + owner = "classabbyamp"; + repo = "convoyeur"; + tag = "v${version}"; + hash = "sha256-gfOmi3yyGEjGPooWocCBIO5wR5hKgz4HmbJBiIMh4RE="; + }; + + cargoHash = "sha256-rMRKTaKleO5QNeLM0jAOJ2kCKGfJxQWACWTqU8A8wt8="; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "IRCv3 FILEHOST extension adapter to external file upload services"; + homepage = "https://codeberg.org/classabbyamp/convoyeur"; + mainProgram = "convoyeur"; + license = lib.licenses.liliq-p-11; + maintainers = with lib.maintainers; [ lenny ]; + }; +} diff --git a/pkgs/by-name/de/deadlock-mod-manager/package.nix b/pkgs/by-name/de/deadlock-mod-manager/package.nix index 384df971f063..30b09b3aa2df 100644 --- a/pkgs/by-name/de/deadlock-mod-manager/package.nix +++ b/pkgs/by-name/de/deadlock-mod-manager/package.nix @@ -27,19 +27,19 @@ }: rustPlatform.buildRustPackage (finalAttrs: { pname = "deadlock-mod-manager"; - version = "0.16.0"; + version = "0.17.0"; src = fetchFromGitHub { owner = "deadlock-mod-manager"; repo = "deadlock-mod-manager"; tag = "v${finalAttrs.version}"; - hash = "sha256-rsOaCgP7ub4FkTkg1VWPZyf+N2I0qM0DCIIqBpJZCVg="; + hash = "sha256-8Z2w/92P/3PpFDcT1rhO3X4gyoV+l9uLb4jZ4Ixz6ck="; }; cargoRoot = "apps/desktop"; buildAndTestSubdir = finalAttrs.cargoRoot; - cargoHash = "sha256-aUtJzgjc9reFxUVMRwqCd2lNMRALlfMkfIRN4QT3g+E="; + cargoHash = "sha256-MQog4ro5NWXmyS5aPZBb7K4LwfIDzxdhGZjWlh5LelE="; nativeBuildInputs = [ rustPlatform.cargoSetupHook @@ -79,7 +79,7 @@ rustPlatform.buildRustPackage (finalAttrs: { pnpm = pnpm_9; fetcherVersion = 2; sourceRoot = "source"; - hash = "sha256-oQxW0q+myMllwLQd+GRXXvnce+bYtwTLEEwFU0nupv4="; + hash = "sha256-vZvQrKiuKlwY2+QCpsG2nm8uA0hmX0MOk603EcKbyOg="; }; patches = [ diff --git a/pkgs/by-name/dp/dprint/package.nix b/pkgs/by-name/dp/dprint/package.nix index e9d59ad36b66..dd755de16e2c 100644 --- a/pkgs/by-name/dp/dprint/package.nix +++ b/pkgs/by-name/dp/dprint/package.nix @@ -12,7 +12,7 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "dprint"; - version = "0.53.0"; + version = "0.53.2"; # Prefer repository rather than crate here # - They have Cargo.lock in the repository @@ -21,10 +21,10 @@ rustPlatform.buildRustPackage (finalAttrs: { owner = "dprint"; repo = "dprint"; tag = finalAttrs.version; - hash = "sha256-4LtE/r/qUiZb4bOph/XEx+U0g11fvyX/nKZh8Ikt0SQ="; + hash = "sha256-n2nb8+Iplm9AMlyxCfRjGmuES1FvYIVgcilSg7LcjiM="; }; - cargoHash = "sha256-BV+hyiuIvn811E1y0IWOTkjtEpH/l6drWHXeMIXeOWk="; + cargoHash = "sha256-FTD8rCdMC1W+1SE5ezAz3rLNc6UErGbN0/5uiPCABuk="; nativeBuildInputs = [ installShellFiles ]; diff --git a/pkgs/by-name/fr/freifunk-meshviewer/package.nix b/pkgs/by-name/fr/freifunk-meshviewer/package.nix index f4658e61c76a..2113ba0fc0b5 100644 --- a/pkgs/by-name/fr/freifunk-meshviewer/package.nix +++ b/pkgs/by-name/fr/freifunk-meshviewer/package.nix @@ -7,16 +7,16 @@ buildNpmPackage (finalAttrs: { pname = "freifunk-meshviewer"; - version = "13.0.0"; + version = "13.1.0"; src = fetchFromGitHub { owner = "freifunk"; repo = "meshviewer"; tag = "v${finalAttrs.version}"; - sha256 = "sha256-KMI2pKzGSsSOB1XzAd8Jv1YLJWK/RUiZJv/kOs+Mpbo="; + sha256 = "sha256-u9lX7B402KFOHyaReyg3f5rDYDshbO/lyMYo7XxgJR8="; }; - npmDepsHash = "sha256-EI0A4s86moYerWvZHPLnyy2O87ZskiP/tr8rAGO8MbE="; + npmDepsHash = "sha256-BaFtFdOu+WArH75nPtasSpecdGjMxTchFcF+K7krNpM="; installPhase = '' mkdir -p $out/share/freifunk-meshviewer/ diff --git a/pkgs/by-name/go/gogh/package.nix b/pkgs/by-name/go/gogh/package.nix index a51792f20d0c..695ac6dd2bd8 100644 --- a/pkgs/by-name/go/gogh/package.nix +++ b/pkgs/by-name/go/gogh/package.nix @@ -25,13 +25,13 @@ let in stdenvNoCC.mkDerivation (finalAttrs: { pname = "gogh"; - version = "364"; + version = "365"; src = fetchFromGitHub { owner = "Gogh-Co"; repo = "Gogh"; tag = "v${finalAttrs.version}"; - hash = "sha256-DVaUmpXWGb+bIdGZqXbiAsiuGTrwvPJdxCyA4g82LFA="; + hash = "sha256-qK3E7ceeVqBgJ8rSotfH3K9WpxE5dS/h4a7Ml5qwlS0="; }; postPatch = '' diff --git a/pkgs/by-name/op/openclaw/package.nix b/pkgs/by-name/op/openclaw/package.nix index 23629043201a..be4bdb77df9a 100644 --- a/pkgs/by-name/op/openclaw/package.nix +++ b/pkgs/by-name/op/openclaw/package.nix @@ -9,7 +9,6 @@ nodejs_22, makeWrapper, versionCheckHook, - nix-update-script, rolldown, installShellFiles, version ? "2026.3.12", @@ -100,7 +99,7 @@ stdenvNoCC.mkDerivation (finalAttrs: { nativeInstallCheckInputs = [ versionCheckHook ]; doInstallCheck = true; - passthru.updateScript = nix-update-script { }; + passthru.updateScript = ./update.sh; meta = { description = "Self-hosted, open-source AI assistant/agent"; diff --git a/pkgs/by-name/op/openclaw/update.sh b/pkgs/by-name/op/openclaw/update.sh new file mode 100755 index 000000000000..8075ad23540a --- /dev/null +++ b/pkgs/by-name/op/openclaw/update.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env nix-shell +#!nix-shell -I nixpkgs=./. -i bash -p nix-update +#shellcheck shell=bash + +set -euo pipefail + +export NIXPKGS_ALLOW_INSECURE=1 # package has knownVulnerabilities +nix-update "$UPDATE_NIX_ATTR_PATH" diff --git a/pkgs/by-name/pl/plymouth/package.nix b/pkgs/by-name/pl/plymouth/package.nix index c9d0456f10c6..73c15366fd25 100644 --- a/pkgs/by-name/pl/plymouth/package.nix +++ b/pkgs/by-name/pl/plymouth/package.nix @@ -2,6 +2,7 @@ lib, stdenv, fetchFromGitLab, + fetchpatch, writeText, replaceVars, meson, @@ -19,6 +20,7 @@ systemd, xkeyboard-config, fontconfig, + systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd, }: stdenv.mkDerivation (finalAttrs: { @@ -47,6 +49,13 @@ stdenv.mkDerivation (finalAttrs: { (replaceVars ./fix-paths.patch { fcmatch = "${fontconfig}/bin/fc-match"; }) + + # fix build without udev, see https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/382 - drop on next release + (fetchpatch { + name = "fix-build-without-udev.patch"; + url = "https://gitlab.freedesktop.org/plymouth/plymouth/-/commit/f1ce78764482699b28f60c89af1a071ea0ae13ca.patch"; + hash = "sha256-t5xt/scO8mVwESU8pFPTSXILd0FhmG/XRZ8O/4baQB8="; + }) ]; strictDeps = true; @@ -67,8 +76,10 @@ stdenv.mkDerivation (finalAttrs: { libpng libxkbcommon pango - systemd xkeyboard-config + ] + ++ lib.optionals systemdSupport [ + systemd ]; mesonFlags = @@ -87,9 +98,12 @@ stdenv.mkDerivation (finalAttrs: { "-Dbackground-start-color-stop=0x000000" "-Dbackground-end-color-stop=0x000000" "-Drelease-file=/etc/os-release" - "-Dudev=enabled" + "-Dudev=${if systemdSupport then "enabled" else "disabled"}" "-Drunstatedir=/run" "-Druntime-plugins=true" + "-Dsystemd-integration=${lib.boolToString systemdSupport}" + ] + ++ lib.optionals systemdSupport [ "--cross-file=${crossFile}" ]; diff --git a/pkgs/by-name/rw/rwpspread/package.nix b/pkgs/by-name/rw/rwpspread/package.nix index 1a82e5afdd2e..d5f730262254 100644 --- a/pkgs/by-name/rw/rwpspread/package.nix +++ b/pkgs/by-name/rw/rwpspread/package.nix @@ -9,16 +9,16 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "rwpspread"; - version = "0.5.0"; + version = "0.5.1"; src = fetchFromGitHub { owner = "0xk1f0"; repo = "rwpspread"; rev = "v${finalAttrs.version}"; - hash = "sha256-lp9XvILpvNZtffJLyDUCo5Xyor4X4bwsfxAIqS8Hf7M="; + hash = "sha256-SWykTlj51lrPz7c9TfNOhMEZcpi8NMLDx50ZqnNlfsU="; }; - cargoHash = "sha256-aGy29kGwCKHBNzszYR+w+1m8gZ/lFd0MOlFHtDDzjj4="; + cargoHash = "sha256-vrCxtbhCFtHRvqwDow7njz/V2QWzs7p/28MTZL4XsBc="; nativeBuildInputs = [ pkg-config ]; diff --git a/pkgs/by-name/sh/shellhub-agent/package.nix b/pkgs/by-name/sh/shellhub-agent/package.nix index d217cdb2461e..e05a51661f0d 100644 --- a/pkgs/by-name/sh/shellhub-agent/package.nix +++ b/pkgs/by-name/sh/shellhub-agent/package.nix @@ -12,18 +12,18 @@ buildGoModule (finalAttrs: { pname = "shellhub-agent"; - version = "0.22.0"; + version = "0.24.0"; src = fetchFromGitHub { owner = "shellhub-io"; repo = "shellhub"; rev = "v${finalAttrs.version}"; - hash = "sha256-Ngb6n1P5Bb11et5x1mTF4rQjx/TdfE93nLc2NRz4aSg="; + hash = "sha256-NV2VA/rquf0TwTAsaAA6TIHp1BwD+5jE8uOZg7tW/kI="; }; modRoot = "./agent"; - vendorHash = "sha256-FlbSHLkJlOdbgfS+B5f8GLihw2KNQCh3G8kt8E+eb3w="; + vendorHash = "sha256-dloFaS/BUnyd9kHB0d2vsibkgFlQwTBkgRBOiBbq2ZY="; ldflags = [ "-s" diff --git a/pkgs/by-name/vi/vicinae/package.nix b/pkgs/by-name/vi/vicinae/package.nix index 4e0865026d6c..2d4a657fc126 100644 --- a/pkgs/by-name/vi/vicinae/package.nix +++ b/pkgs/by-name/vi/vicinae/package.nix @@ -23,13 +23,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "vicinae"; - version = "0.20.8"; + version = "0.20.9"; src = fetchFromGitHub { owner = "vicinaehq"; repo = "vicinae"; tag = "v${finalAttrs.version}"; - hash = "sha256-G+ibcIvOaPE3qot4zLmHUo7cmNFNU1kw2Zhn08D26Ts="; + hash = "sha256-ax517n+zbfOvr2H+QfyqAq/6Ad3Qu3CnlaI4q6JfrXk="; }; apiDeps = fetchNpmDeps { diff --git a/pkgs/development/python-modules/aioairctrl/default.nix b/pkgs/development/python-modules/aioairctrl/default.nix index 133027b1b527..6c1a6abbcc3f 100644 --- a/pkgs/development/python-modules/aioairctrl/default.nix +++ b/pkgs/development/python-modules/aioairctrl/default.nix @@ -1,26 +1,29 @@ { lib, buildPythonPackage, - fetchPypi, + fetchFromGitHub, setuptools, - wheel, + setuptools-scm, aiocoap, pycryptodomex, + pytestCheckHook, }: buildPythonPackage rec { pname = "aioairctrl"; - version = "0.2.6"; + version = "0.3.1"; pyproject = true; - src = fetchPypi { - inherit pname version; - hash = "sha256-mQNgkgQ83GOSc0g0ATctlr4ZeB7g8iGd4qTZfyoO8DM="; + src = fetchFromGitHub { + owner = "kongo09"; + repo = "aioairctrl"; + tag = "v${version}"; + hash = "sha256-Ea5OMbpwDubhnpY5K0CVXZneEGtNWkqkQQ7JwVa/JNU="; }; build-system = [ setuptools - wheel + setuptools-scm ]; dependencies = [ @@ -30,9 +33,12 @@ buildPythonPackage rec { pythonImportsCheck = [ "aioairctrl" ]; - doCheck = false; # no tests + nativeCheckInputs = [ + pytestCheckHook + ]; meta = { + changelog = "https://github.com/kongo09/aioairctrl/releases/tag/${src.tag}"; description = "Library for controlling Philips air purifiers (using encrypted CoAP)"; homepage = "https://github.com/kongo09/aioairctrl"; license = lib.licenses.mit; diff --git a/pkgs/development/python-modules/aioamazondevices/default.nix b/pkgs/development/python-modules/aioamazondevices/default.nix index b383ba92521c..a5402907cce8 100644 --- a/pkgs/development/python-modules/aioamazondevices/default.nix +++ b/pkgs/development/python-modules/aioamazondevices/default.nix @@ -16,14 +16,14 @@ buildPythonPackage rec { pname = "aioamazondevices"; - version = "13.0.1"; + version = "13.3.2"; pyproject = true; src = fetchFromGitHub { owner = "chemelli74"; repo = "aioamazondevices"; tag = "v${version}"; - hash = "sha256-FCHANMtOMGiV+RqAXRUHpax2UH4xwLRHaJzWvXwZC7U="; + hash = "sha256-DaQbcWnE/Ij8NpBJ7d0YjWQwKn+mxNw4P4RPT0Lmfs8="; }; build-system = [ poetry-core ]; diff --git a/pkgs/development/python-modules/aioesphomeapi/default.nix b/pkgs/development/python-modules/aioesphomeapi/default.nix index 8ae3ade2e6c5..965b92c7cd61 100644 --- a/pkgs/development/python-modules/aioesphomeapi/default.nix +++ b/pkgs/development/python-modules/aioesphomeapi/default.nix @@ -26,14 +26,14 @@ buildPythonPackage (finalAttrs: { pname = "aioesphomeapi"; - version = "44.2.0"; + version = "44.8.0"; pyproject = true; src = fetchFromGitHub { owner = "esphome"; repo = "aioesphomeapi"; tag = "v${finalAttrs.version}"; - hash = "sha256-YJhNHNeY6952XrNthhLEzo/GVkKQC5QOcvTpAVbgRic="; + hash = "sha256-8vc9efKFXTQ1or4uAIMo7ElHc7gaaxKheWGb2RcppbQ="; }; build-system = [ diff --git a/pkgs/development/python-modules/aiohasupervisor/default.nix b/pkgs/development/python-modules/aiohasupervisor/default.nix index 615859401ebe..a4a3aaf8d4c1 100644 --- a/pkgs/development/python-modules/aiohasupervisor/default.nix +++ b/pkgs/development/python-modules/aiohasupervisor/default.nix @@ -10,29 +10,26 @@ pytest-cov-stub, pytest-timeout, pytestCheckHook, - pythonOlder, setuptools, yarl, }: buildPythonPackage rec { pname = "aiohasupervisor"; - version = "0.3.3"; + version = "0.4.3"; pyproject = true; - disabled = pythonOlder "3.12"; - src = fetchFromGitHub { owner = "home-assistant-libs"; repo = "python-supervisor-client"; tag = version; - hash = "sha256-v6w+g1M3VR/an3a5MfWf8fDCHNzRC4+05L7GW45PzWU="; + hash = "sha256-h22y62f+pdoHYKqPeKNGFkVS7/IMWbxaAoDLomwAB40="; }; postPatch = '' substituteInPlace pyproject.toml \ --replace-fail 'version = "0.0.0"' 'version = "${version}"' \ - --replace-fail "setuptools>=68.0,<80.10" "setuptools" + --replace-fail "setuptools>=68.0,<82.1" "setuptools" ''; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/aiohomematic-config/default.nix b/pkgs/development/python-modules/aiohomematic-config/default.nix index a01eceb5c624..85b192d16b38 100644 --- a/pkgs/development/python-modules/aiohomematic-config/default.nix +++ b/pkgs/development/python-modules/aiohomematic-config/default.nix @@ -11,14 +11,14 @@ buildPythonPackage (finalAttrs: { pname = "aiohomematic-config"; - version = "2026.3.2"; + version = "2026.3.5"; pyproject = true; src = fetchFromGitHub { owner = "sukramj"; repo = "aiohomematic-config"; tag = finalAttrs.version; - hash = "sha256-0TfRaTL+oxukl4nMPTxrtLMqCxAOcAW/brXxCeP9NB4="; + hash = "sha256-OGpGtF+BH+WWIGGfpS6myJ7fPi1wuWYjeSS9y9LhXGY="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/aiohomematic/default.nix b/pkgs/development/python-modules/aiohomematic/default.nix index 0818b918d2df..8c9ab2ae39bf 100644 --- a/pkgs/development/python-modules/aiohomematic/default.nix +++ b/pkgs/development/python-modules/aiohomematic/default.nix @@ -18,7 +18,7 @@ buildPythonPackage rec { pname = "aiohomematic"; - version = "2026.3.8"; + version = "2026.3.23"; pyproject = true; disabled = pythonOlder "3.14"; @@ -27,7 +27,7 @@ buildPythonPackage rec { owner = "SukramJ"; repo = "aiohomematic"; tag = version; - hash = "sha256-uVG8rMxgb5JwNy9r9jT17BIZFxGn5rxtzRtQV6Mfxkk="; + hash = "sha256-zbXz/pg5CB8YLs6oF3Nv8gVimc/jQu3pHRpD/y3Wp5Q="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/aiomealie/default.nix b/pkgs/development/python-modules/aiomealie/default.nix index 77cd080a7e08..fbff112528b5 100644 --- a/pkgs/development/python-modules/aiomealie/default.nix +++ b/pkgs/development/python-modules/aiomealie/default.nix @@ -17,14 +17,14 @@ buildPythonPackage (finalAttrs: { pname = "aiomealie"; - version = "1.2.1"; + version = "1.2.2"; pyproject = true; src = fetchFromGitHub { owner = "joostlek"; repo = "python-mealie"; tag = "v${finalAttrs.version}"; - hash = "sha256-TwzE5GAP4DNxj3DZdu83eSobcYYbrOn9tPb+8904a/8="; + hash = "sha256-2244R2r+b08UG58Amd94Dsn6d59oAiJLL6jOd4ZOqro="; }; build-system = [ poetry-core ]; diff --git a/pkgs/development/python-modules/aiotedee/default.nix b/pkgs/development/python-modules/aiotedee/default.nix index 51e9fa355e31..e1493f5d2261 100644 --- a/pkgs/development/python-modules/aiotedee/default.nix +++ b/pkgs/development/python-modules/aiotedee/default.nix @@ -1,31 +1,41 @@ { lib, aiohttp, + aioresponses, buildPythonPackage, fetchFromGitHub, + mashumaro, + pytest-asyncio, + pytestCheckHook, setuptools, }: buildPythonPackage rec { pname = "aiotedee"; - version = "0.2.27"; + version = "0.3.0"; pyproject = true; src = fetchFromGitHub { owner = "zweckj"; repo = "aiotedee"; tag = "v${version}"; - hash = "sha256-yN5v/kZ3oX3HYqgQR33gyCkGkHaAdPpP1Q9Q0eavJJs="; + hash = "sha256-0+wUQRsMb9y8XUwwUX3exIzkaAFLYNUpsAr0MgnkMIo="; }; build-system = [ setuptools ]; - dependencies = [ aiohttp ]; + dependencies = [ + aiohttp + mashumaro + ]; pythonImportsCheck = [ "aiotedee" ]; - # Module has no tests - doCheck = false; + nativeCheckInputs = [ + aioresponses + pytest-asyncio + pytestCheckHook + ]; meta = { description = "Module to interact with Tedee locks"; diff --git a/pkgs/development/python-modules/bimmer-connected/default.nix b/pkgs/development/python-modules/bimmer-connected/default.nix deleted file mode 100644 index 7ef9df343f09..000000000000 --- a/pkgs/development/python-modules/bimmer-connected/default.nix +++ /dev/null @@ -1,82 +0,0 @@ -{ - lib, - buildPythonPackage, - fetchFromGitHub, - pbr, - httpx, - pillow, - pycryptodome, - pyjwt, - pytest-asyncio, - pytestCheckHook, - python, - respx, - setuptools, - time-machine, - tzdata, -}: - -buildPythonPackage rec { - pname = "bimmer-connected"; - version = "0.17.4"; - pyproject = true; - - src = fetchFromGitHub { - owner = "bimmerconnected"; - repo = "bimmer_connected"; - tag = version; - hash = "sha256-wNrUZepfkEFPvU3HWop9JAjCHlK3v+xTuAUIZ0P4YtA="; - }; - - build-system = [ - pbr - setuptools - ]; - - env.PBR_VERSION = version; - - dependencies = [ - httpx - pycryptodome - pyjwt - ]; - - optional-dependencies = { - china = [ pillow ]; - }; - - postInstall = '' - cp -R bimmer_connected/tests/responses $out/${python.sitePackages}/bimmer_connected/tests/ - ''; - - nativeCheckInputs = [ - pytest-asyncio - pytestCheckHook - respx - time-machine - ] - ++ lib.concatAttrValues optional-dependencies; - - disabledTests = [ - # presumably regressed in pytest-asyncio 0.23.0 - "test_get_remote_position_too_old" - ]; - - preCheck = '' - export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo - export PATH=$out/bin:$PATH - ''; - - pythonImportsCheck = [ "bimmer_connected" ]; - - meta = { - changelog = "https://github.com/bimmerconnected/bimmer_connected/releases/tag/${version}"; - description = "Library to read data from the BMW Connected Drive portal"; - mainProgram = "bimmerconnected"; - homepage = "https://github.com/bimmerconnected/bimmer_connected"; - license = lib.licenses.asl20; - maintainers = with lib.maintainers; [ dotlambda ]; - # https://github.com/bimmerconnected/bimmer_connected#library-not-working-anymore-due-to-changes-at-bmw-side - broken = true; - }; -} diff --git a/pkgs/development/python-modules/bleak-esphome/default.nix b/pkgs/development/python-modules/bleak-esphome/default.nix index 6f9233189938..931a780564fe 100644 --- a/pkgs/development/python-modules/bleak-esphome/default.nix +++ b/pkgs/development/python-modules/bleak-esphome/default.nix @@ -19,14 +19,14 @@ buildPythonPackage (finalAttrs: { pname = "bleak-esphome"; - version = "3.6.0"; + version = "3.7.1"; pyproject = true; src = fetchFromGitHub { owner = "bluetooth-devices"; repo = "bleak-esphome"; tag = "v${finalAttrs.version}"; - hash = "sha256-XZ/JjrHJ8Zd1t2Ahi0Jc7S/bkXMIBHfDTVanoGemtI0="; + hash = "sha256-drNMU0Ka5e3uQ9UHXP5O+I4l4jOxUdq2Bf0WcsGk9IM="; }; postPatch = '' diff --git a/pkgs/development/python-modules/bleak-retry-connector/default.nix b/pkgs/development/python-modules/bleak-retry-connector/default.nix index 2213d3d9c737..d9922f1a4d0e 100644 --- a/pkgs/development/python-modules/bleak-retry-connector/default.nix +++ b/pkgs/development/python-modules/bleak-retry-connector/default.nix @@ -14,14 +14,14 @@ buildPythonPackage rec { pname = "bleak-retry-connector"; - version = "4.5.0"; + version = "4.6.0"; pyproject = true; src = fetchFromGitHub { owner = "Bluetooth-Devices"; repo = "bleak-retry-connector"; tag = "v${version}"; - hash = "sha256-aGk5wNrQ8ti2qu1FxmOqPtDpivm5DRaKvwzDNz9rFmQ="; + hash = "sha256-wUfIP0UHL60AAq38j4Kc2enTccdhT7aaSrXWJ1y5+7I="; }; build-system = [ poetry-core ]; diff --git a/pkgs/development/python-modules/certbot/default.nix b/pkgs/development/python-modules/certbot/default.nix index 3d1500ab1c0f..b7d31f76d771 100644 --- a/pkgs/development/python-modules/certbot/default.nix +++ b/pkgs/development/python-modules/certbot/default.nix @@ -5,7 +5,6 @@ python, runCommand, fetchFromGitHub, - fetchpatch, configargparse, acme, configobj, @@ -25,25 +24,17 @@ buildPythonPackage rec { pname = "certbot"; - version = "5.3.1"; + version = "5.4.0"; pyproject = true; src = fetchFromGitHub { owner = "certbot"; repo = "certbot"; tag = "v${version}"; - hash = "sha256-u9qzZFhvIapXQwxehvMieCV+4uigteSOeHVw7ycMCEU="; + hash = "sha256-Tu46Wybod89TiwsVccNuQcweWoeQE1wbH+pDWNC9+kE="; }; - patches = [ - (fetchpatch { - name = "fix-test_rollback_too_many.patch"; - url = "https://github.com/certbot/certbot/commit/4c61a450d4a843c66baab6d5d9a42ce0554e99d7.patch"; - hash = "sha256-PSh2JXoEWNUrqxNh8X5QchyIP8KRHT60T/cLax6VRWo="; - }) - ]; - - postPatch = "cd certbot"; # using sourceRoot would interfere with patches + sourceRoot = "${src.name}/certbot"; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/deebot-client/default.nix b/pkgs/development/python-modules/deebot-client/default.nix index d1666dda5660..d8b37c9d8dca 100644 --- a/pkgs/development/python-modules/deebot-client/default.nix +++ b/pkgs/development/python-modules/deebot-client/default.nix @@ -22,7 +22,7 @@ buildPythonPackage (finalAttrs: { pname = "deebot-client"; - version = "18.0.0"; + version = "18.1.0"; pyproject = true; disabled = pythonOlder "3.13"; @@ -31,12 +31,12 @@ buildPythonPackage (finalAttrs: { owner = "DeebotUniverse"; repo = "client.py"; tag = finalAttrs.version; - hash = "sha256-ZKLA8RbYsysY+pAT9K6z2yThWo2YeM6TLqLBMuo+/GQ="; + hash = "sha256-+URVdNcuV7H/vrYw+8fq6IdZ9OSZsbqDEZSd8s5XKyA="; }; cargoDeps = rustPlatform.fetchCargoVendor { inherit (finalAttrs) pname version src; - hash = "sha256-UcgQKv8YhsWdOzKQ7K3HTX/FmopQen7HQ/Jyuj+hePI="; + hash = "sha256-umCaUmtlKPs/sxdZ0BdA9pbg5gy4aOQl3uSAioD1gXs="; }; nativeBuildInputs = [ diff --git a/pkgs/development/python-modules/enocean-async/default.nix b/pkgs/development/python-modules/enocean-async/default.nix new file mode 100644 index 000000000000..a92f9dd4d86f --- /dev/null +++ b/pkgs/development/python-modules/enocean-async/default.nix @@ -0,0 +1,51 @@ +{ + buildPythonPackage, + fetchFromGitHub, + fetchpatch, + lib, + pyserial-asyncio-fast, + pytest-asyncio, + pytestCheckHook, + pythonOlder, + setuptools, +}: + +buildPythonPackage (finalAttrs: { + pname = "enocean-async"; + version = "0.4.2"; + pyproject = true; + + disabled = pythonOlder "3.14"; + + src = fetchFromGitHub { + owner = "henningkerstan"; + repo = "enocean-async"; + tag = "v${finalAttrs.version}"; + hash = "sha256-VBBZwNPBgJ9rXUaAVtRzgdebeDtfJCt7R1zOu3Eom80="; + }; + + build-system = [ setuptools ]; + + dependencies = [ + pyserial-asyncio-fast + ]; + + pythonImportsCheck = [ "enocean_async" ]; + + nativeCheckInputs = [ + pytest-asyncio + pytestCheckHook + ]; + + disabledTestPaths = [ + # tests have broken imports, fixed in 0.12.4 + "tests/test_eep.py" + ]; + + meta = { + changelog = "https://github.com/henningkerstan/enocean-async/blob/${finalAttrs.src.tag}/CHANGELOG.md"; + description = "Async implementation of the EnOcean Serial Protocol Version 3"; + license = lib.licenses.asl20; + maintainers = [ lib.maintainers.dotlambda ]; + }; +}) diff --git a/pkgs/development/python-modules/enocean/default.nix b/pkgs/development/python-modules/enocean/default.nix deleted file mode 100644 index 1419e19605ad..000000000000 --- a/pkgs/development/python-modules/enocean/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ - lib, - buildPythonPackage, - fetchFromGitHub, - fetchpatch2, - - # build-system - setuptools, - - # dependencies - beautifulsoup4, - pyserial, - - # tests - pytestCheckHook, -}: - -buildPythonPackage rec { - pname = "enocean"; - version = "0.60.1"; - pyproject = true; - - src = fetchFromGitHub { - owner = "kipe"; - repo = "enocean"; - tag = version; - hash = "sha256-S62YvRP1bvEzzzMd/jMjIdHAZsUImF9EQhsrPPzebDE="; - }; - - patches = [ - (fetchpatch2 { - name = "replace-nose-with-pytest.patch"; - url = "https://github.com/kipe/enocean/commit/e5ca3b70f0920f129219c980ad549d7f3a4576de.patch"; - hash = "sha256-cDBvI0I4W5YkGTpg+rKy08TUAmKlhKa/5+Muou9iArs="; - }) - ]; - - build-system = [ setuptools ]; - - pythonRemoveDeps = [ "enum-compat" ]; - - dependencies = [ - beautifulsoup4 - pyserial - ]; - - nativeCheckInputs = [ pytestCheckHook ]; - - pythonImportsCheck = [ - "enocean.communicators" - "enocean.protocol.packet" - "enocean.utils" - ]; - - meta = { - changelog = "https://github.com/kipe/enocean/releases/tag/${version}"; - description = "EnOcean serial protocol implementation"; - mainProgram = "enocean_example.py"; - homepage = "https://github.com/kipe/enocean"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ dotlambda ]; - }; -} diff --git a/pkgs/development/python-modules/evohome-async/default.nix b/pkgs/development/python-modules/evohome-async/default.nix index 8fcb74b42eee..2a00401bad30 100644 --- a/pkgs/development/python-modules/evohome-async/default.nix +++ b/pkgs/development/python-modules/evohome-async/default.nix @@ -9,10 +9,10 @@ debugpy, fetchFromGitHub, hatchling, + keyring, pytest-asyncio, pytest-freezer, pytestCheckHook, - pythonOlder, pyyaml, syrupy, voluptuous, @@ -20,16 +20,14 @@ buildPythonPackage (finalAttrs: { pname = "evohome-async"; - version = "1.1.3"; + version = "1.2.0"; pyproject = true; - disabled = pythonOlder "3.12"; - src = fetchFromGitHub { owner = "zxdavb"; repo = "evohome-async"; tag = "v${finalAttrs.version}"; - hash = "sha256-Xc5GWbKqgcIIHKBvcAIS8zL9rZeEDEkwHOhhUdnImbE="; + hash = "sha256-CbC5ms3YcNB6n5UmCHfHKTtyJau68m8QZ5UwRyiR9MM="; }; build-system = [ hatchling ]; @@ -45,6 +43,7 @@ buildPythonPackage (finalAttrs: { aiofiles asyncclick debugpy + keyring ]; }; diff --git a/pkgs/development/python-modules/fnv-hash-fast/default.nix b/pkgs/development/python-modules/fnv-hash-fast/default.nix index 864d3474c22d..6c8b6313dbe9 100644 --- a/pkgs/development/python-modules/fnv-hash-fast/default.nix +++ b/pkgs/development/python-modules/fnv-hash-fast/default.nix @@ -13,14 +13,14 @@ buildPythonPackage rec { pname = "fnv-hash-fast"; - version = "1.6.0"; + version = "2.0.2"; pyproject = true; src = fetchFromGitHub { owner = "bdraco"; repo = "fnv-hash-fast"; tag = "v${version}"; - hash = "sha256-1o/SwX9N+wBNVkihUuCYrJAEH28FxhKEhyOEK7tK1XE="; + hash = "sha256-wfiOI23LzdoTYl5/Wr/+3qvcJ3ce9ZrfETQXX1g6eIU="; }; build-system = [ @@ -31,8 +31,6 @@ buildPythonPackage rec { dependencies = [ fnvhash ]; - pythonRelaxDeps = [ "fnvhash" ]; - pythonImportsCheck = [ "fnv_hash_fast" ]; nativeCheckInputs = [ diff --git a/pkgs/development/python-modules/gardena-bluetooth/default.nix b/pkgs/development/python-modules/gardena-bluetooth/default.nix index bdb69de26583..42a624460871 100644 --- a/pkgs/development/python-modules/gardena-bluetooth/default.nix +++ b/pkgs/development/python-modules/gardena-bluetooth/default.nix @@ -1,29 +1,29 @@ { lib, asyncclick, - bleak, bleak-retry-connector, + bleak, buildPythonPackage, fetchFromGitHub, - poetry-core, pytest-asyncio, pytestCheckHook, + setuptools, tzlocal, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "gardena-bluetooth"; - version = "1.6.0"; + version = "2.1.0"; pyproject = true; src = fetchFromGitHub { owner = "elupus"; repo = "gardena-bluetooth"; - tag = version; - hash = "sha256-L726A0o9TIxFjHOxx0e42RIj4XMOdeZTJE2gWo6OhG4="; + tag = finalAttrs.version; + hash = "sha256-H02Uq/n2iWAtrO/Reg+yWkFxVkLJWUhq3frc50EF4fo="; }; - build-system = [ poetry-core ]; + build-system = [ setuptools ]; dependencies = [ bleak @@ -45,8 +45,8 @@ buildPythonPackage rec { meta = { description = "Module for interacting with Gardena Bluetooth"; homepage = "https://github.com/elupus/gardena-bluetooth"; - changelog = "https://github.com/elupus/gardena-bluetooth/releases/tag/${version}"; + changelog = "https://github.com/elupus/gardena-bluetooth/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ fab ]; }; -} +}) diff --git a/pkgs/development/python-modules/growattserver/default.nix b/pkgs/development/python-modules/growattserver/default.nix index ce1dc8e38d90..58c2666c18e2 100644 --- a/pkgs/development/python-modules/growattserver/default.nix +++ b/pkgs/development/python-modules/growattserver/default.nix @@ -8,14 +8,14 @@ buildPythonPackage (finalAttrs: { pname = "growattserver"; - version = "2.0.0"; + version = "1.9.0"; pyproject = true; src = fetchFromGitHub { owner = "indykoning"; repo = "PyPi_GrowattServer"; tag = finalAttrs.version; - hash = "sha256-HsBNxE1iHdZbyzGF1rKqiftDXKbOXy8Wf2rQ17kWz6k="; + hash = "sha256-CTIc+LROas7RGf9BzGl8hasS512LsNXcDnzLu0DD+Bk="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/habluetooth/default.nix b/pkgs/development/python-modules/habluetooth/default.nix index ada4eec695c2..839b18d56e8b 100644 --- a/pkgs/development/python-modules/habluetooth/default.nix +++ b/pkgs/development/python-modules/habluetooth/default.nix @@ -20,14 +20,14 @@ buildPythonPackage rec { pname = "habluetooth"; - version = "5.8.0"; + version = "5.11.2"; pyproject = true; src = fetchFromGitHub { owner = "Bluetooth-Devices"; repo = "habluetooth"; tag = "v${version}"; - hash = "sha256-VbD4fAOZtDtPIGGYb3ISP7c9YLBXAXeOIICqf9Pm5ho="; + hash = "sha256-/5oJOSNP3vbmX7V8m6LLomNAvRzV2hM0vMCbwjFBmbg="; }; build-system = [ diff --git a/pkgs/development/python-modules/hass-nabucasa/default.nix b/pkgs/development/python-modules/hass-nabucasa/default.nix index 5c87162801c2..07485d536e1d 100644 --- a/pkgs/development/python-modules/hass-nabucasa/default.nix +++ b/pkgs/development/python-modules/hass-nabucasa/default.nix @@ -2,7 +2,6 @@ lib, acme, aiohttp, - async-timeout, atomicwrites-homeassistant, attrs, buildPythonPackage, @@ -32,16 +31,16 @@ buildPythonPackage (finalAttrs: { pname = "hass-nabucasa"; - version = "1.15.0"; + version = "2.2.0"; pyproject = true; - disabled = pythonOlder "3.13"; + disabled = pythonOlder "3.14"; src = fetchFromGitHub { owner = "nabucasa"; repo = "hass-nabucasa"; tag = finalAttrs.version; - hash = "sha256-WwpCAIfl/2fp01v9Rq4tQW70aoVlvhEJl31XQTAENmA="; + hash = "sha256-+HRyXdl/gw/dhZ+T3peinD5FMm0O/M87Uu/wyLU1eJs="; }; postPatch = '' @@ -54,7 +53,6 @@ buildPythonPackage (finalAttrs: { dependencies = [ acme aiohttp - async-timeout atomicwrites-homeassistant attrs ciso8601 diff --git a/pkgs/development/python-modules/home-connect-async/default.nix b/pkgs/development/python-modules/home-connect-async/default.nix index 283eae7a23a4..a149c84cbfd7 100644 --- a/pkgs/development/python-modules/home-connect-async/default.nix +++ b/pkgs/development/python-modules/home-connect-async/default.nix @@ -13,13 +13,13 @@ buildPythonPackage rec { pname = "home-connect-async"; - version = "0.8.3"; + version = "0.8.5"; pyproject = true; src = fetchPypi { pname = "home_connect_async"; inherit version; - hash = "sha256-G+mHXNbqU0pgqpvGfKmn6CrwZOhRG76m57eHimgN17s="; + hash = "sha256-LiBBE9AiyMWipQKtHsOZ5rfqOgB75flrJYtU1oAw+hs="; }; build-system = [ diff --git a/pkgs/development/python-modules/infrared-protocols/default.nix b/pkgs/development/python-modules/infrared-protocols/default.nix new file mode 100644 index 000000000000..a76c6f7bc8fe --- /dev/null +++ b/pkgs/development/python-modules/infrared-protocols/default.nix @@ -0,0 +1,36 @@ +{ + buildPythonPackage, + fetchFromGitHub, + lib, + pytestCheckHook, + setuptools, +}: + +buildPythonPackage (finalAttrs: { + pname = "infrared-protocols"; + version = "1.1.0"; + pyproject = true; + + src = fetchFromGitHub { + owner = "home-assistant-libs"; + repo = "infrared-protocols"; + tag = finalAttrs.version; + hash = "sha256-Sw9N8vdmdR13itUtx3Vcmc0DJN8IcIub+mzEWms/fpE="; + }; + + build-system = [ setuptools ]; + + pythonImportsCheck = [ "infrared_protocols" ]; + + nativeCheckInputs = [ + pytestCheckHook + ]; + + meta = { + changelog = "https://github.com/home-assistant-libs/infrared-protocols/releases/tag/${finalAttrs.src.tag}"; + description = "Library to decode and encode infrared signals"; + homepage = "https://github.com/home-assistant-libs/infrared-protocols"; + license = lib.licenses.mit; + maintainers = [ lib.maintainers.dotlambda ]; + }; +}) diff --git a/pkgs/development/python-modules/knx-frontend/default.nix b/pkgs/development/python-modules/knx-frontend/default.nix index 8557a368d062..76ef8f87c8b1 100644 --- a/pkgs/development/python-modules/knx-frontend/default.nix +++ b/pkgs/development/python-modules/knx-frontend/default.nix @@ -7,14 +7,14 @@ buildPythonPackage rec { pname = "knx-frontend"; - version = "2026.3.2.183756"; + version = "2026.3.28.223133"; pyproject = true; # TODO: source build, uses yarn.lock src = fetchPypi { pname = "knx_frontend"; inherit version; - hash = "sha256-OaY14AY3iaAbs8EDCLDI1LmwjtOcz1NBBWhZEU2apjI="; + hash = "sha256-U/lHc4SZcUEG1yq2sMkSzM9n/n6TuNhbx4U2ZmMqAY0="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/librehardwaremonitor-api/default.nix b/pkgs/development/python-modules/librehardwaremonitor-api/default.nix index fa46516f19e6..c28de0228210 100644 --- a/pkgs/development/python-modules/librehardwaremonitor-api/default.nix +++ b/pkgs/development/python-modules/librehardwaremonitor-api/default.nix @@ -9,14 +9,14 @@ buildPythonPackage rec { pname = "librehardwaremonitor-api"; - version = "1.10.1"; + version = "1.11.1"; pyproject = true; src = fetchFromGitHub { owner = "Sab44"; repo = "librehardwaremonitor-api"; tag = "v${version}"; - hash = "sha256-l9xfO6PzJSYCoZWLdYpeZFpVK0x3ysvS+VM/9BPKlFs="; + hash = "sha256-GAJgLrfYhkdafk0DSgcNgXQ2vjtBf/kOEkkRw7i9rlE="; }; build-system = [ hatchling ]; diff --git a/pkgs/development/python-modules/motionblindsble/asyncio-compat.patch b/pkgs/development/python-modules/motionblindsble/asyncio-compat.patch new file mode 100644 index 000000000000..1036817062e6 --- /dev/null +++ b/pkgs/development/python-modules/motionblindsble/asyncio-compat.patch @@ -0,0 +1,28 @@ +diff --git a/motionblindsble/device.py b/motionblindsble/device.py +index 9c6ecf9..0d9affc 100644 +--- a/motionblindsble/device.py ++++ b/motionblindsble/device.py +@@ -11,6 +11,8 @@ from asyncio import ( + TimerHandle, + create_task, + get_event_loop, ++ new_event_loop, ++ set_event_loop, + sleep, + wait, + ) +@@ -248,7 +250,13 @@ class ConnectionQueue: + ) + return device._create_task(target=device.establish_connection()) + _LOGGER.debug("(%s) Connecting", device.ble_device.address) +- return get_event_loop().create_task(device.establish_connection()) ++ try: ++ loop = get_event_loop() ++ except RuntimeError: ++ loop = new_event_loop() ++ set_event_loop(loop) ++ ++ return loop.create_task(device.establish_connection()) + + async def wait_for_connection(self, device: MotionDevice) -> bool: + """Wait for a connection, return True to last caller if connected.""" diff --git a/pkgs/development/python-modules/motionblindsble/default.nix b/pkgs/development/python-modules/motionblindsble/default.nix index 4a1336dabe68..8b7cf0fa36aa 100644 --- a/pkgs/development/python-modules/motionblindsble/default.nix +++ b/pkgs/development/python-modules/motionblindsble/default.nix @@ -22,6 +22,11 @@ buildPythonPackage rec { hash = "sha256-1dA3YTjoAhe+p5vk6Xb42a+rE63m2mn5iHhVV/6tlQ0="; }; + patches = [ + # https://github.com/LennP/motionblindsble/pull/3 + ./asyncio-compat.patch + ]; + postPatch = '' substituteInPlace setup.py \ --replace-fail "{{VERSION_PLACEHOLDER}}" "${version}" diff --git a/pkgs/development/python-modules/psnawp/default.nix b/pkgs/development/python-modules/psnawp/default.nix index 144f7cde3e6d..226f707ed890 100644 --- a/pkgs/development/python-modules/psnawp/default.nix +++ b/pkgs/development/python-modules/psnawp/default.nix @@ -23,6 +23,10 @@ buildPythonPackage rec { build-system = [ poetry-core ]; + pythonRelaxDeps = [ + "pycountry" + ]; + dependencies = [ pycountry pyrate-limiter diff --git a/pkgs/development/python-modules/pyinsteon/default.nix b/pkgs/development/python-modules/pyinsteon/default.nix index 1a585027c692..11800bfcff4a 100644 --- a/pkgs/development/python-modules/pyinsteon/default.nix +++ b/pkgs/development/python-modules/pyinsteon/default.nix @@ -10,7 +10,6 @@ pyserial, pyserial-asyncio-fast, pytestCheckHook, - pythonAtLeast, setuptools, voluptuous, }: @@ -27,6 +26,11 @@ buildPythonPackage rec { hash = "sha256-iC0qeiTHtrdzQtJ3R01nJDCfdBKBg0jw1v49ZII24/4="; }; + patches = [ + # https://github.com/pyinsteon/pyinsteon/pull/440 + ./python-3.14.diff + ]; + build-system = [ setuptools ]; dependencies = [ diff --git a/pkgs/development/python-modules/pyinsteon/python-3.14.diff b/pkgs/development/python-modules/pyinsteon/python-3.14.diff new file mode 100644 index 000000000000..8622b42e481f --- /dev/null +++ b/pkgs/development/python-modules/pyinsteon/python-3.14.diff @@ -0,0 +1,693 @@ +commit d9866fc537a16fc7d8f8c6116eae78a77679efbd +Author: Sandro Jäckel +Date: Wed, 1 Apr 2026 23:12:22 +0200 + + Fix Python 3.14 support + +diff --git a/pyinsteon/tools/tools_base.py b/pyinsteon/tools/tools_base.py +index 01a6101..6ad4cb3 100644 +--- a/pyinsteon/tools/tools_base.py ++++ b/pyinsteon/tools/tools_base.py +@@ -19,7 +19,7 @@ + from ..constants import RelayMode, ThermostatMode, ToggleMode + from ..x10_address import X10Address + from .log_filter import NoStdoutFilter, StdoutFilter, StripPrefixFilter +-from .utils import patch_stdin_stdout, set_loop, stdio ++from .utils import patch_stdin_stdout, stdio + + _LOGGING = logging.getLogger(__name__) + LOG_FILE_NAME = "pyinsteon_tools.log" +@@ -272,7 +272,6 @@ def start(cls): + ) + args = parser.parse_args() + +- set_loop() + loop = asyncio.get_event_loop() + + intro = [ +diff --git a/pyinsteon/tools/utils.py b/pyinsteon/tools/utils.py +index daed401..263c4a5 100644 +--- a/pyinsteon/tools/utils.py ++++ b/pyinsteon/tools/utils.py +@@ -1,7 +1,7 @@ + """Utilities for the tools commands.""" + + import asyncio +-from asyncio.events import BaseDefaultEventLoopPolicy ++from asyncio import DefaultEventLoopPolicy + import os + import sys + +@@ -81,21 +81,3 @@ async def drain(self): + return await loop.run_in_executor(None, sys.stdout.writelines, data) + + return Win32StdinReader(), Win32StdoutWriter() +- +- +-def set_loop() -> None: +- """Attempt to use different loop.""" +- if sys.platform == "win32": +- if hasattr(asyncio, "WindowsProactorEventLoopPolicy"): +- # pylint: disable=no-member +- policy = asyncio.WindowsProactorEventLoopPolicy() +- else: +- +- class ProactorPolicy(BaseDefaultEventLoopPolicy): +- """Event loop policy to create proactor loops.""" +- +- _loop_factory = asyncio.ProactorEventLoop +- +- policy = ProactorPolicy() +- +- asyncio.set_event_loop_policy(policy) +diff --git a/tests/test_managers/test_device_link_manager.py b/tests/test_managers/test_device_link_manager.py +index 1eca93d..7db9d25 100644 +--- a/tests/test_managers/test_device_link_manager.py ++++ b/tests/test_managers/test_device_link_manager.py +@@ -24,7 +24,7 @@ def _reset_devices(addresses): + device.async_status = AsyncMock() + device.aldb.clear_pending() + device.aldb.async_write = AsyncMock() +- device.aldb.async_write.call_count = 0 ++ device.aldb.async_write.reset_mock() + device.aldb.clear = Mock() + device.async_status.return_value = ResponseStatus.SUCCESS + +@@ -73,7 +73,7 @@ async def test_device_links_broadcast(self): + + topic = "1a1a1a.1.on.all_link_broadcast" + topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "00.00.01"), 0) +- devices["3c3c3c"].async_status.call_count = 0 ++ devices["3c3c3c"].async_status.reset_mock() + send_topics([topic_item]) + await asyncio.sleep(0.2) + assert devices["3c3c3c"].async_status.call_count == 1 +@@ -89,7 +89,7 @@ async def test_device_links_cleanup(self): + ): + topic = "1a1a1a.1.off.all_link_cleanup" + topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "11.11.11"), 0) +- devices["3c3c3c"].async_status.call_count = 0 ++ devices["3c3c3c"].async_status.reset_mock() + send_topics([topic_item]) + await asyncio.sleep(0.2) + assert devices["3c3c3c"].async_status.call_count == 1 +@@ -108,7 +108,7 @@ async def test_device_links_dedup(self): + topic_cleanup_item = TopicItem( + topic_cleanup, cmd_kwargs(0x11, 0xFF, None, "11.11.11"), 0.2 + ) +- devices["3c3c3c"].async_status.call_count = 0 ++ devices["3c3c3c"].async_status.reset_mock() + send_topics([topic_broadcast_item, topic_cleanup_item]) + await asyncio.sleep(1) + assert devices["3c3c3c"].async_status.call_count == 1 +@@ -250,7 +250,7 @@ async def test_device_links_broadcast_no_response(self): + + topic = "1a1a1a.1.off.all_link_broadcast" + topic_item = TopicItem(topic, cmd_kwargs(0x11, 0xFF, None, "00.00.01"), 0) +- devices["3c3c3c"].async_status.call_count = 0 ++ devices["3c3c3c"].async_status.reset_mock() + devices["3c3c3c"].async_status.return_value = ResponseStatus.FAILURE + send_topics([topic_item]) + await asyncio.sleep(0.2) +diff --git a/tests/test_managers/test_link_manager.py b/tests/test_managers/test_link_manager.py +index cd2e602..8104617 100644 +--- a/tests/test_managers/test_link_manager.py ++++ b/tests/test_managers/test_link_manager.py +@@ -23,7 +23,7 @@ def _reset_devices(addresses): + device.async_status = AsyncMock() + device.aldb.clear_pending() + device.aldb.async_write = AsyncMock() +- device.aldb.async_write.call_count = 0 ++ device.aldb.async_write.reset_mock() + device.aldb.clear = Mock() + device.async_status.return_value = ResponseStatus.SUCCESS + +diff --git a/tests/test_managers/test_scene_manager.py b/tests/test_managers/test_scene_manager.py +index 9371fdf..d816cfb 100644 +--- a/tests/test_managers/test_scene_manager.py ++++ b/tests/test_managers/test_scene_manager.py +@@ -37,7 +37,7 @@ def _reset_devices(addresses): + device = devices[addr] + device.aldb.clear_pending() + device.aldb.async_write = AsyncMock(return_value=(0, 0)) +- device.aldb.async_write.call_count = 0 ++ device.aldb.async_write.reset_mock() + device.aldb.clear = Mock() + + +diff --git a/tests/test_tools/test_advanced.py b/tests/test_tools/test_advanced.py +index 9ebe6ee..2cc2e46 100644 +--- a/tests/test_tools/test_advanced.py ++++ b/tests/test_tools/test_advanced.py +@@ -131,7 +131,7 @@ async def test_enter_linking_mode(self): + inputs, + allow_logging=True, + ) +- mock_enter_linking_mode.call_count = 0 ++ mock_enter_linking_mode.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_enter_linking_mode.call_count == 1 + mock_enter_linking_mode.assert_called_with( +@@ -147,7 +147,7 @@ async def test_enter_linking_mode(self): + inputs, + allow_logging=True, + ) +- mock_enter_linking_mode.call_count = 0 ++ mock_enter_linking_mode.reset_mock() + stdout.buffer = [] + remove_log_file(curr_dir) + await cmd_mgr.async_cmdloop("") +@@ -170,7 +170,7 @@ async def test_enter_linking_mode(self): + cmd_mgr, _, stdout = self.setup_cmd_tool( + AdvancedTools, inputs, allow_logging=True + ) +- mock_enter_linking_mode.call_count = 0 ++ mock_enter_linking_mode.reset_mock() + stdout.buffer = [] + remove_log_file(curr_dir) + await cmd_mgr.async_cmdloop("") +@@ -199,7 +199,7 @@ async def test_enter_linking_mode(self): + AdvancedTools, + inputs, + ) +- mock_enter_linking_mode.call_count = 0 ++ mock_enter_linking_mode.reset_mock() + stdout.buffer = [] + remove_log_file(curr_dir) + await cmd_mgr.async_cmdloop("") +@@ -228,7 +228,7 @@ async def test_enter_linking_mode(self): + AdvancedTools, + inputs, + ) +- mock_enter_linking_mode.call_count = 0 ++ mock_enter_linking_mode.reset_mock() + stdout.buffer = [] + remove_log_file(curr_dir) + await cmd_mgr.async_cmdloop("") +@@ -275,8 +275,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 1 + assert good_device.aldb.async_write.call_count == 1 +@@ -291,8 +291,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -306,8 +306,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -321,8 +321,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -336,8 +336,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -349,8 +349,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -364,8 +364,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -383,8 +383,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 1 + assert good_device.aldb.async_write.call_count == 1 +@@ -402,8 +402,8 @@ async def test_remove_link(self): + inputs, + allow_logging=True, + ) +- good_device.aldb.remove.call_count = 0 +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.remove.reset_mock() ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert good_device.aldb.remove.call_count == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -422,8 +422,8 @@ async def test_remove_link(self): + ) + + battery_device.aldb.load_saved_records(ALDBStatus.LOADED, records) +- battery_device.aldb.remove.call_count = 0 +- battery_device.aldb.async_write.call_count = 0 ++ battery_device.aldb.remove.reset_mock() ++ battery_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert battery_device.aldb.remove.call_count == 1 + assert battery_device.aldb.async_write.call_count == 1 +@@ -884,7 +884,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -904,7 +904,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + +@@ -923,7 +923,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + +@@ -942,7 +942,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -969,7 +969,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -996,7 +996,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -1022,7 +1022,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -1048,7 +1048,7 @@ async def test_add_link(self): + ) + good_device.aldb.load_saved_records(ALDBStatus.EMPTY, {}) + good_device.aldb.async_write = AsyncMock(return_value=(0, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop() + assert len(good_device.aldb.pending_changes) == 0 + assert good_device.aldb.async_write.call_count == 0 +@@ -1154,7 +1154,7 @@ async def test_cancel_linking_mode(self): + inputs, + allow_logging=True, + ) +- mock_cancel_linking_mode.call_count = 0 ++ mock_cancel_linking_mode.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_cancel_linking_mode.call_count == 1 + +@@ -1356,7 +1356,7 @@ def create_random_arg_str( + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 1 + +@@ -1373,7 +1373,7 @@ def create_random_arg_str( + ) + good_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + good_device.aldb.async_write = AsyncMock(return_value=(0, 1)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 1 + +@@ -1389,7 +1389,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1405,7 +1405,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1421,7 +1421,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1437,7 +1437,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1453,7 +1453,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1473,7 +1473,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1493,7 +1493,7 @@ def create_random_arg_str( + allow_logging=True, + ) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 + +@@ -1515,7 +1515,7 @@ def create_random_arg_str( + ) + battery_device.aldb.load_saved_records(ALDBStatus.LOADED, records) + battery_device.aldb.async_write = AsyncMock(return_value=(0, 0)) +- battery_device.aldb.async_write.call_count = 0 ++ battery_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert battery_device.aldb.async_write.call_count == 1 + +@@ -1532,6 +1532,6 @@ def create_random_arg_str( + ) + good_device.aldb.load_saved_records(ALDBStatus.PARTIAL, records) + good_device.aldb.async_write = AsyncMock(return_value=(1, 0)) +- good_device.aldb.async_write.call_count = 0 ++ good_device.aldb.async_write.reset_mock() + await cmd_mgr.async_cmdloop("") + assert good_device.aldb.async_write.call_count == 0 +diff --git a/tests/test_tools/test_aldb.py b/tests/test_tools/test_aldb.py +index 5edd9d6..207babd 100644 +--- a/tests/test_tools/test_aldb.py ++++ b/tests/test_tools/test_aldb.py +@@ -130,7 +130,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 1 + if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL: +@@ -153,7 +153,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 1 + if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL: +@@ -190,7 +190,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 1 + if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL: +@@ -228,7 +228,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 1 + if device.cat == DeviceCategory.DIMMABLE_LIGHTING_CONTROL: +@@ -262,7 +262,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 0 + +@@ -275,7 +275,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 0 + +@@ -287,7 +287,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 0 + +@@ -299,7 +299,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 0 + +@@ -311,7 +311,7 @@ async def test_add_device_to_scene(self): + "exit", + ], + ) +- mock_async_link_devices.call_count = 0 ++ mock_async_link_devices.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_async_link_devices.call_count == 0 + +@@ -496,7 +496,7 @@ def __init__(self): + cmd_mgr, _, _ = self.setup_cmd_tool( + ToolsAldb, [f"{command} {mock_device.address} y", "exit"] + ) +- mock_device.aldb.async_load.call_count = 0 ++ mock_device.aldb.async_load.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_device.aldb.async_load.call_count == 1 # no retry + +@@ -504,7 +504,7 @@ def __init__(self): + cmd_mgr, _, _ = self.setup_cmd_tool( + ToolsAldb, [f"load_aldb {devices.modem.address}", "exit"] + ) +- devices.modem.aldb.async_load.call_count = 0 ++ devices.modem.aldb.async_load.reset_mock() + await cmd_mgr.async_cmdloop("") + assert devices.modem.aldb.async_load.call_count == 1 + devices.modem.aldb.async_load.assert_called_with() +diff --git a/tests/test_tools/test_commands.py b/tests/test_tools/test_commands.py +index e9ac640..91cdea6 100644 +--- a/tests/test_tools/test_commands.py ++++ b/tests/test_tools/test_commands.py +@@ -221,8 +221,8 @@ async def test_scene_on_off(self): + "exit", + ], + ) +- mock_trigger_scene_on.call_count = 0 +- mock_trigger_scene_off.call_count = 0 ++ mock_trigger_scene_on.reset_mock() ++ mock_trigger_scene_off.reset_mock() + await cmd_mgr.async_cmdloop("") + if cmd == "scene_on": + assert mock_trigger_scene_on.call_count == 1 +@@ -241,8 +241,8 @@ async def test_scene_on_off(self): + "exit", + ], + ) +- mock_trigger_scene_on.call_count = 0 +- mock_trigger_scene_off.call_count = 0 ++ mock_trigger_scene_on.reset_mock() ++ mock_trigger_scene_off.reset_mock() + await cmd_mgr.async_cmdloop("") + if cmd == "scene_on": + assert mock_trigger_scene_on.call_count == 1 +@@ -263,8 +263,8 @@ async def test_scene_on_off(self): + device_01.async_on = AsyncMock() + device_01.async_off = AsyncMock() + stdout.buffer = [] +- mock_trigger_scene_on.call_count = 0 +- mock_trigger_scene_off.call_count = 0 ++ mock_trigger_scene_on.reset_mock() ++ mock_trigger_scene_off.reset_mock() + await cmd_mgr.async_cmdloop("") + buffer = clean_buffer(stdout.buffer) + assert buffer[2] == "Scene number is required\n" +@@ -472,7 +472,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False): + "exit", + ], + ) +- mock_method.call_count = 0 ++ mock_method.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_method.call_count == 1 + mock_method.assert_called_with(on_level=255, group=0, fast=False) +@@ -491,7 +491,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False): + "exit", + ], + ) +- mock_method.call_count = 0 ++ mock_method.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_method.call_count == 1 + mock_method.assert_called_with(on_level=on_level, group=0, fast=False) +@@ -509,7 +509,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False): + "exit", + ], + ) +- mock_method.call_count = 0 ++ mock_method.reset_mock() + await cmd_mgr.async_cmdloop("") + assert mock_method.call_count == 1 + mock_method.assert_called_with(on_level=255, group=0, fast=True) +@@ -568,7 +568,7 @@ async def mock_missing_arg(on_level: int, group: int = 0, fast: bool = False): + "exit", + ], + ) +- mock_method.call_count = 0 ++ mock_method.reset_mock() + stdout.buffer = [] + await cmd_mgr.async_cmdloop("") + buffer = clean_buffer(stdout.buffer) +diff --git a/tests/test_tools/test_main.py b/tests/test_tools/test_main.py +index 0f8b038..e6b562e 100644 +--- a/tests/test_tools/test_main.py ++++ b/tests/test_tools/test_main.py +@@ -978,7 +978,7 @@ async def test_remove_device(self): + await cmd_mgr.async_cmdloop() + assert mock_unlink_devices.call_count == 3 + +- mock_unlink_devices.call_count = 0 ++ mock_unlink_devices.reset_mock() + # Remove known device using command line mode + cmd_mgr, _, _ = self.setup_cmd_tool( + InsteonCmd, [f"remove_device {str(good_address)}", 1, "exit"] +@@ -987,7 +987,7 @@ async def test_remove_device(self): + assert mock_unlink_devices.call_count == 0 + assert devices.async_remove_device.call_count == 1 + +- mock_unlink_devices.call_count = 0 ++ mock_unlink_devices.reset_mock() + # Remove known device using input mode + cmd_mgr, _, _ = self.setup_cmd_tool( + InsteonCmd, ["remove_device", str(good_address), 1, "exit"] +@@ -996,8 +996,8 @@ async def test_remove_device(self): + assert mock_unlink_devices.call_count == 0 + assert devices.async_remove_device.call_count == 2 + +- mock_unlink_devices.call_count = 0 +- # Remove known device using bakcground mode ++ mock_unlink_devices.reset_mock() ++ # Remove known device using background mode + cmd_mgr, _, _ = self.setup_cmd_tool( + InsteonCmd, [f"remove_device -b {str(good_address)}", 1, "exit"] + ) +@@ -1005,7 +1005,7 @@ async def test_remove_device(self): + assert mock_unlink_devices.call_count == 0 + assert devices.async_remove_device.call_count == 3 + +- mock_unlink_devices.call_count = 0 ++ mock_unlink_devices.reset_mock() + # Remove known device using command line mode with force + cmd_mgr, _, _ = self.setup_cmd_tool( + InsteonCmd, [f"remove_device {str(good_address)} f", 1, "exit"] diff --git a/pkgs/development/python-modules/pyintelliclima/default.nix b/pkgs/development/python-modules/pyintelliclima/default.nix index 5a95e7d0dcc8..0880ae038b66 100644 --- a/pkgs/development/python-modules/pyintelliclima/default.nix +++ b/pkgs/development/python-modules/pyintelliclima/default.nix @@ -12,14 +12,14 @@ buildPythonPackage (finalAttrs: { pname = "pyintelliclima"; - version = "0.2.2"; + version = "0.3.1"; pyproject = true; src = fetchFromGitHub { owner = "dvdinth"; repo = "pyintelliclima"; tag = "v${finalAttrs.version}"; - hash = "sha256-gfOfEc39o4JAdvr6GI9ly5AuRV+sseCvWY/jNAh1A5M="; + hash = "sha256-EHcnrynvNIfo31vZyh8tS/5JfFuEQGVlYzu4XyD3XCI="; }; pythonRelaxDeps = [ "dacite" ]; diff --git a/pkgs/development/python-modules/pyliebherrhomeapi/default.nix b/pkgs/development/python-modules/pyliebherrhomeapi/default.nix index df6c3ae728ab..77071a755866 100644 --- a/pkgs/development/python-modules/pyliebherrhomeapi/default.nix +++ b/pkgs/development/python-modules/pyliebherrhomeapi/default.nix @@ -11,14 +11,14 @@ buildPythonPackage (finalAttrs: { pname = "pyliebherrhomeapi"; - version = "0.3.0"; + version = "0.4.1"; pyproject = true; src = fetchFromGitHub { owner = "mettolen"; repo = "pyliebherrhomeapi"; tag = finalAttrs.version; - hash = "sha256-J+s9oRKK2DWZV05M1bvDEBqczaJXuif4t3eOJUgrAu0="; + hash = "sha256-f0+2gqNLeyLP6rOAWay+T04ry21SPA79pm+prG7kJtc="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/pylitterbot/default.nix b/pkgs/development/python-modules/pylitterbot/default.nix index ea704454d4d2..c1cdf476130b 100644 --- a/pkgs/development/python-modules/pylitterbot/default.nix +++ b/pkgs/development/python-modules/pylitterbot/default.nix @@ -16,14 +16,14 @@ buildPythonPackage rec { pname = "pylitterbot"; - version = "2025.1.0"; + version = "2025.2.0"; pyproject = true; src = fetchFromGitHub { owner = "natekspencer"; repo = "pylitterbot"; tag = version; - hash = "sha256-pQnrmH/mfh7cwEnL/qoG3dN638HsP9w5zK0CgarGstE="; + hash = "sha256-o5A4AWil6FeHjUBgbHaA010kszhuncHHzf8+CH4QL0c="; }; build-system = [ diff --git a/pkgs/development/python-modules/pyloadapi/default.nix b/pkgs/development/python-modules/pyloadapi/default.nix index 286d097c367c..fa936d2aa6b1 100644 --- a/pkgs/development/python-modules/pyloadapi/default.nix +++ b/pkgs/development/python-modules/pyloadapi/default.nix @@ -15,7 +15,7 @@ buildPythonPackage rec { pname = "pyloadapi"; - version = "1.4.2"; + version = "2.0.0"; pyproject = true; disabled = pythonOlder "3.12"; @@ -24,7 +24,7 @@ buildPythonPackage rec { owner = "tr4nt0r"; repo = "pyloadapi"; tag = "v${version}"; - hash = "sha256-DkYbQB91KYskfm2yDVmR0/MJiixC2C5miHpTq7RpVBU="; + hash = "sha256-+fGrXKS7jomYMJOPneKyAV/nrvqBFrqh3ds4R46lQ48="; }; build-system = [ diff --git a/pkgs/development/python-modules/pylutron/default.nix b/pkgs/development/python-modules/pylutron/default.nix index c7403648fd3d..dda87c6d23f2 100644 --- a/pkgs/development/python-modules/pylutron/default.nix +++ b/pkgs/development/python-modules/pylutron/default.nix @@ -1,35 +1,50 @@ { lib, buildPythonPackage, - fetchPypi, + fetchFromGitHub, + pytestCheckHook, setuptools, + telnetlib3, }: buildPythonPackage rec { pname = "pylutron"; - version = "0.2.18"; + version = "0.4.0"; pyproject = true; - src = fetchPypi { - inherit pname version; - hash = "sha256-7ZnNfa4POUTMi9sDGMyR6gu9Xpg+j/JmyWVnBBSnRSE="; + src = fetchFromGitHub { + owner = "thecynic"; + repo = "pylutron"; + tag = version; + hash = "sha256-y5RDwlIxmwzKihTDFZKoOJL+TPJbY05MKPUMs2hBWiw="; }; + postPatch = '' + substituteInPlace setup.py \ + --replace-fail TEMPLATE_VERSION ${version} + ''; + build-system = [ setuptools ]; - # Project has no tests - doCheck = false; + dependencies = [ + telnetlib3 + ]; pythonImportsCheck = [ "pylutron" ]; + nativeCheckInputs = [ + pytestCheckHook + ]; + + enabledTestPaths = [ + "tests" + ]; + meta = { description = "Python library for controlling a Lutron RadioRA 2 system"; homepage = "https://github.com/thecynic/pylutron"; changelog = "https://github.com/thecynic/pylutron/releases/tag/${version}"; - license = with lib.licenses; [ - mit - psfl - ]; + license = lib.licenses.mit; maintainers = with lib.maintainers; [ fab ]; }; } diff --git a/pkgs/development/python-modules/pyrate-limiter/default.nix b/pkgs/development/python-modules/pyrate-limiter/default.nix index ebcfc85cdd5d..5de57d7bd3dc 100644 --- a/pkgs/development/python-modules/pyrate-limiter/default.nix +++ b/pkgs/development/python-modules/pyrate-limiter/default.nix @@ -22,21 +22,16 @@ buildPythonPackage rec { pname = "pyrate-limiter"; - version = "4.0.2"; + version = "4.1.0"; pyproject = true; src = fetchFromGitHub { owner = "vutran1710"; repo = "PyrateLimiter"; tag = "v${version}"; - hash = "sha256-xWxe70J69g9Tq35GjdJeT7MjUdoSEGj8w1cIKvLxJss="; + hash = "sha256-2gWbabdRqwWiC4xbMx/VGBwwMcygVMKJswXgd4Ia+xE="; }; - postPatch = '' - # tests cause too many connections to the postgres server and crash/timeout - sed -i "/create_postgres_bucket,/d" tests/conftest.py - ''; - build-system = [ hatchling uv-dynamic-versioning @@ -60,12 +55,13 @@ buildPythonPackage rec { ]; nativeCheckInputs = [ + filelock pytestCheckHook pytest-asyncio pytest-xdist + redis redisTestHook - ] - ++ lib.concatAttrValues optional-dependencies; + ]; disabledTestPaths = [ # Slow: > 1.5 seconds/test run standalone on a fast machine diff --git a/pkgs/development/python-modules/pyswitchbot/default.nix b/pkgs/development/python-modules/pyswitchbot/default.nix index 5cd58cf79a25..acf17ce538c5 100644 --- a/pkgs/development/python-modules/pyswitchbot/default.nix +++ b/pkgs/development/python-modules/pyswitchbot/default.nix @@ -14,14 +14,14 @@ buildPythonPackage (finalAttrs: { pname = "pyswitchbot"; - version = "1.0.0"; + version = "2.0.0"; pyproject = true; src = fetchFromGitHub { owner = "Danielhiversen"; repo = "pySwitchbot"; tag = finalAttrs.version; - hash = "sha256-O8bdWAAtNfLo7WBgvKMm0LXCzpFz1MUqAbBJlyUBcPs="; + hash = "sha256-1DJ7mo1L75PPoVivngJPdbEWFTF36KLShkr3V1/rLDY="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/python-bsblan/default.nix b/pkgs/development/python-modules/python-bsblan/default.nix index b0bc692a021c..848697f344b9 100644 --- a/pkgs/development/python-modules/python-bsblan/default.nix +++ b/pkgs/development/python-modules/python-bsblan/default.nix @@ -19,14 +19,14 @@ buildPythonPackage (finalAttrs: { pname = "python-bsblan"; - version = "5.1.2"; + version = "5.1.3"; pyproject = true; src = fetchFromGitHub { owner = "liudger"; repo = "python-bsblan"; tag = "v${finalAttrs.version}"; - hash = "sha256-P7c+5x5wQaWfNeeYKkylhV2AQESp40duSQfwsTDVW6M="; + hash = "sha256-2Rynat0eXAWzlCBUJAvKrAFPLl74FMr2r1KtKPBlwYw="; }; postPatch = '' diff --git a/pkgs/development/python-modules/python-roborock/default.nix b/pkgs/development/python-modules/python-roborock/default.nix index 381a9992533e..4f7c10581c2f 100644 --- a/pkgs/development/python-modules/python-roborock/default.nix +++ b/pkgs/development/python-modules/python-roborock/default.nix @@ -23,14 +23,14 @@ buildPythonPackage (finalAttrs: { pname = "python-roborock"; - version = "4.18.1"; + version = "5.0.0"; pyproject = true; src = fetchFromGitHub { owner = "Python-roborock"; repo = "python-roborock"; tag = "v${finalAttrs.version}"; - hash = "sha256-5ckpRKwrLkjIAUJiXIRN2N9268pzjEjwVPVK/wSolgE="; + hash = "sha256-Lzr+OBbOjsLpkUsFYNJ37teegWjicUAoW9Jvw3hOvGE="; }; pythonRelaxDeps = [ "pycryptodome" ]; diff --git a/pkgs/development/python-modules/satel-integra/default.nix b/pkgs/development/python-modules/satel-integra/default.nix index e6d7d4650fd0..0db8234d8d8b 100644 --- a/pkgs/development/python-modules/satel-integra/default.nix +++ b/pkgs/development/python-modules/satel-integra/default.nix @@ -3,32 +3,39 @@ buildPythonPackage, fetchFromGitHub, setuptools, - click, + setuptools-scm, + cryptography, + pytest-asyncio, + pytest-cov-stub, pytestCheckHook, }: buildPythonPackage rec { pname = "satel-integra"; - version = "0.3.7"; + version = "1.0.0"; pyproject = true; src = fetchFromGitHub { owner = "c-soft"; repo = "satel_integra"; tag = version; - hash = "sha256-nCFb8NaZQ6TO4aXCSpbbHGkJr3nJVkt1R4hi9mts070="; + hash = "sha256-KMbNa/XSyLF1rAB5qm/Sw2GLgigNGaj8g94Np9FSvhY="; }; - postPatch = '' - substituteInPlace setup.py \ - --replace "'pytest-runner'," "" - ''; + build-system = [ + setuptools + setuptools-scm + ]; - build-system = [ setuptools ]; + dependencies = [ + cryptography + ]; - dependencies = [ click ]; - - nativeCheckInputs = [ pytestCheckHook ]; + nativeCheckInputs = [ + pytest-asyncio + pytest-cov-stub + pytestCheckHook + ]; pythonImportsCheck = [ "satel_integra" ]; diff --git a/pkgs/development/python-modules/sense-energy/default.nix b/pkgs/development/python-modules/sense-energy/default.nix index 578d3988b424..a15214ba69f7 100644 --- a/pkgs/development/python-modules/sense-energy/default.nix +++ b/pkgs/development/python-modules/sense-energy/default.nix @@ -15,14 +15,14 @@ buildPythonPackage rec { pname = "sense-energy"; - version = "0.13.8"; + version = "0.14.0"; pyproject = true; src = fetchFromGitHub { owner = "scottbonline"; repo = "sense"; tag = version; - hash = "sha256-hIE7wjKP+JcXQZ1lGbKCaKKK2ZlCF5BbJu3H7gqrsKU="; + hash = "sha256-he/Ti15H2JBngvNCBSwJQWa0LBIBFa+x38TW9g2CQ44="; }; postPatch = '' diff --git a/pkgs/development/python-modules/switchbot-api/default.nix b/pkgs/development/python-modules/switchbot-api/default.nix index c04a5df6c39f..bf9a58c97ca9 100644 --- a/pkgs/development/python-modules/switchbot-api/default.nix +++ b/pkgs/development/python-modules/switchbot-api/default.nix @@ -1,29 +1,45 @@ { lib, aiohttp, + aioresponses, buildPythonPackage, fetchFromGitHub, poetry-core, + pycryptodome, + pytest-asyncio, + pytest-cov-stub, + pytest-freezer, + pytestCheckHook, + syrupy, }: buildPythonPackage (finalAttrs: { pname = "switchbot-api"; - version = "2.10.0"; + version = "2.11.0"; pyproject = true; src = fetchFromGitHub { owner = "SeraphicCorp"; repo = "py-switchbot-api"; tag = "v${finalAttrs.version}"; - hash = "sha256-s6ezIkW36eIaxqedOfIk4KNhCwjXPFkc49qqK2p2eGw="; + hash = "sha256-n2KAKILbywObqxG/lDNHkXWVCcrEJAaqv6xBDH8ed/Q="; }; build-system = [ poetry-core ]; - dependencies = [ aiohttp ]; + dependencies = [ + aiohttp + pycryptodome + ]; - # Module has no tests - doCheck = false; + nativeCheckInputs = [ + aioresponses + pytest-asyncio + pytest-cov-stub + pytest-freezer + pytestCheckHook + syrupy + ]; pythonImportsCheck = [ "switchbot_api" ]; diff --git a/pkgs/development/python-modules/telnetlib3/default.nix b/pkgs/development/python-modules/telnetlib3/default.nix new file mode 100644 index 000000000000..2f110d75bba3 --- /dev/null +++ b/pkgs/development/python-modules/telnetlib3/default.nix @@ -0,0 +1,69 @@ +{ + addBinToPathHook, + blessed, + buildPythonPackage, + fetchFromGitHub, + hatchling, + lib, + pexpect, + prettytable, + pytest-asyncio, + pytest-cov-stub, + pytest-timeout, + pytest-xdist, + pytestCheckHook, + trustme, + wcwidth, +}: + +buildPythonPackage (finalAttrs: { + pname = "telnetlib3"; + version = "4.0.1"; + pyproject = true; + + src = fetchFromGitHub { + owner = "jquast"; + repo = "telnetlib3"; + tag = finalAttrs.version; + hash = "sha256-dKvdg+1l7qRyc7COR0U6SKbrp5uJRtc4wsDPQEAkXZ8="; + }; + + build-system = [ hatchling ]; + + pythonRelaxDeps = [ + "wcwidth" + ]; + + dependencies = [ + blessed + wcwidth + ]; + + optional-dependencies = { + extras = [ + prettytable + # FIXME package ucs-detect + ]; + }; + + pythonImportsCheck = [ "telnetlib3" ]; + + nativeCheckInputs = [ + addBinToPathHook + pexpect + pytest-asyncio + pytest-cov-stub + pytest-timeout + pytest-xdist + pytestCheckHook + trustme + ]; + + meta = { + changelog = "https://github.com/jquast/telnetlib3/blob/${finalAttrs.src.tag}/docs/history.rst"; + description = "Feature-rich Telnet Server, Client, and Protocol library for Python"; + homepage = "https://github.com/jquast/telnetlib3"; + license = lib.licenses.isc; + maintainers = [ lib.maintainers.dotlambda ]; + }; +}) diff --git a/pkgs/development/python-modules/universal-silabs-flasher/default.nix b/pkgs/development/python-modules/universal-silabs-flasher/default.nix index 9b2a23664e2b..6b8275cec207 100644 --- a/pkgs/development/python-modules/universal-silabs-flasher/default.nix +++ b/pkgs/development/python-modules/universal-silabs-flasher/default.nix @@ -14,26 +14,26 @@ crc, gpiod, pyserial-asyncio-fast, + tqdm, typing-extensions, zigpy, # tests + aioresponses, pytestCheckHook, pytest-asyncio, - pytest-mock, - pytest-timeout, }: buildPythonPackage rec { pname = "universal-silabs-flasher"; - version = "0.1.3"; + version = "1.0.3"; pyproject = true; src = fetchFromGitHub { owner = "NabuCasa"; repo = "universal-silabs-flasher"; tag = "v${version}"; - hash = "sha256-VBMxm953xp0qt4MIfOSjFNQu2jOh52uQ9Zz94NWy3dY="; + hash = "sha256-6rdWi+un85YWSann2zHFFnWvAZF6V8wXBP1VunaiZMo="; }; postPatch = '' @@ -50,16 +50,16 @@ buildPythonPackage rec { coloredlogs crc pyserial-asyncio-fast + tqdm typing-extensions zigpy ] ++ lib.optionals (stdenv.hostPlatform.isLinux) [ gpiod ]; nativeCheckInputs = [ + aioresponses pytestCheckHook pytest-asyncio - pytest-mock - pytest-timeout ]; disabledTests = [ diff --git a/pkgs/development/python-modules/victron-ble-ha-parser/default.nix b/pkgs/development/python-modules/victron-ble-ha-parser/default.nix index 8967675c5135..e8cd7406c3d8 100644 --- a/pkgs/development/python-modules/victron-ble-ha-parser/default.nix +++ b/pkgs/development/python-modules/victron-ble-ha-parser/default.nix @@ -10,14 +10,14 @@ buildPythonPackage rec { pname = "victron-ble-ha-parser"; - version = "0.4.10"; + version = "0.6.3"; pyproject = true; src = fetchFromGitHub { owner = "rajlaud"; repo = "victron-ble-ha-parser"; tag = "v${version}"; - hash = "sha256-mvQrY1f3Da621yMgTzxduZQ0pxCJN6j7+6pgFwgl4Rs="; + hash = "sha256-wSkTIX1TTP2geU7bgsdJj6Nv5SIGgd6k84G7tRCo3O0="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/yalexs-ble/default.nix b/pkgs/development/python-modules/yalexs-ble/default.nix index b3d15c3f04b1..bfbf7222d6f1 100644 --- a/pkgs/development/python-modules/yalexs-ble/default.nix +++ b/pkgs/development/python-modules/yalexs-ble/default.nix @@ -15,14 +15,14 @@ buildPythonPackage (finalAttrs: { pname = "yalexs-ble"; - version = "3.2.8"; + version = "3.3.0"; pyproject = true; src = fetchFromGitHub { owner = "Yale-Libs"; repo = "yalexs-ble"; tag = "v${finalAttrs.version}"; - hash = "sha256-Aq0tZp5h3vDxxoPYefSCoTqJV8dZYvMbITd3icdIMf8="; + hash = "sha256-K6DZ1fjXDp6IjTfW2BTc83HR6xi5i0hFn4NOteJaGMU="; }; build-system = [ poetry-core ]; diff --git a/pkgs/development/python-modules/yoto-api/default.nix b/pkgs/development/python-modules/yoto-api/default.nix index 5e0afaf28551..a1cf84e4c9be 100644 --- a/pkgs/development/python-modules/yoto-api/default.nix +++ b/pkgs/development/python-modules/yoto-api/default.nix @@ -10,14 +10,14 @@ buildPythonPackage rec { pname = "yoto-api"; - version = "2.1.2"; + version = "2.2.3"; pyproject = true; src = fetchFromGitHub { owner = "cdnninja"; repo = "yoto_api"; tag = "v${version}"; - hash = "sha256-bRJjDgmMLJcmWyyxTg0BLjBukGi8JX9WWz9IoUl9Fcw="; + hash = "sha256-+xe/ghVmWs39MfR+v76M1AhTMB5LHAA8ChSHzVY8S3w="; }; build-system = [ setuptools ]; diff --git a/pkgs/development/python-modules/zha-quirks/default.nix b/pkgs/development/python-modules/zha-quirks/default.nix index d245815d0b93..34825adc5ba9 100644 --- a/pkgs/development/python-modules/zha-quirks/default.nix +++ b/pkgs/development/python-modules/zha-quirks/default.nix @@ -13,7 +13,7 @@ buildPythonPackage rec { pname = "zha-quirks"; - version = "1.0.1"; + version = "1.1.1"; pyproject = true; disabled = pythonOlder "3.12"; @@ -22,7 +22,7 @@ buildPythonPackage rec { owner = "zigpy"; repo = "zha-device-handlers"; tag = version; - hash = "sha256-u57Bv3oK0yAQLijlEG18brCfJXZghaA9OhbcGJ+GtCk="; + hash = "sha256-GxNxc+cu3wBjz/1VF2+0DJ/PBTLlJKm0ncgzeaw5Fxw="; }; postPatch = '' @@ -59,7 +59,7 @@ buildPythonPackage rec { meta = { description = "ZHA Device Handlers are custom quirks implementations for Zigpy"; - homepage = "https://github.com/dmulcahey/zha-device-handlers"; + homepage = "https://github.com/zigpy/zha-device-handlers"; changelog = "https://github.com/zigpy/zha-device-handlers/releases/tag/${src.tag}"; license = lib.licenses.asl20; maintainers = with lib.maintainers; [ fab ]; diff --git a/pkgs/development/python-modules/zha/default.nix b/pkgs/development/python-modules/zha/default.nix index 9e9f89aed91e..572a41572091 100644 --- a/pkgs/development/python-modules/zha/default.nix +++ b/pkgs/development/python-modules/zha/default.nix @@ -23,7 +23,7 @@ buildPythonPackage rec { pname = "zha"; - version = "1.0.2"; + version = "1.1.1"; pyproject = true; disabled = pythonOlder "3.12"; @@ -32,7 +32,7 @@ buildPythonPackage rec { owner = "zigpy"; repo = "zha"; tag = version; - hash = "sha256-ps3Qq1iGB9uPXe8CWDGLbST90EIAmszT0nuh0AvUjKg="; + hash = "sha256-hr+FeBVQ1yqQGOhhTBd4c1g6OEntGaPPuHt1/nD+HKE="; }; postPatch = '' diff --git a/pkgs/development/python-modules/zigpy/default.nix b/pkgs/development/python-modules/zigpy/default.nix index d82ef94cfa61..f6f0f32b18c1 100644 --- a/pkgs/development/python-modules/zigpy/default.nix +++ b/pkgs/development/python-modules/zigpy/default.nix @@ -24,14 +24,14 @@ buildPythonPackage rec { pname = "zigpy"; - version = "1.1.1"; + version = "1.2.2"; pyproject = true; src = fetchFromGitHub { owner = "zigpy"; repo = "zigpy"; tag = version; - hash = "sha256-/KbWpXo+IsK2AdPN18aNorVtvcFHFx/Igg/0Mn8NsRM="; + hash = "sha256-xCgQJYZJTjt81RC6rLb5hEyauJD3qxMK5TXTxTgXwT4="; }; postPatch = '' diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix index a3365ee73819..313017e0e2d3 100644 --- a/pkgs/servers/home-assistant/component-packages.nix +++ b/pkgs/servers/home-assistant/component-packages.nix @@ -2,7 +2,7 @@ # Do not edit! { - version = "2026.3.4"; + version = "2026.4.0"; components = { "3_day_blinds" = ps: with ps; [ @@ -504,6 +504,9 @@ "automation" = ps: with ps; [ ]; + "autoskope" = + ps: with ps; [ + ]; # missing inputs: autoskope_client "avea" = ps: with ps; [ avea @@ -587,6 +590,9 @@ ps: with ps; [ mozart-api ]; + "battery" = + ps: with ps; [ + ]; "bauknecht" = ps: with ps; [ ]; @@ -742,12 +748,8 @@ zeroconf ]; "bmw_connected_drive" = - ps: - with ps; - [ - bimmer-connected - ] - ++ bimmer-connected.optional-dependencies.china; + ps: with ps; [ + ]; "bond" = ps: with ps; [ bond-async @@ -883,6 +885,32 @@ ha-ffmpeg py-canary ]; + "casper_glow" = + ps: with ps; [ + aioesphomeapi + aiohasupervisor + aioruuvigateway + aioshelly + aiousbwatcher + bleak + bleak-esphome + bleak-retry-connector + bluetooth-adapters + bluetooth-auto-recovery + bluetooth-data-tools + dbus-fast + esphome-dashboard-api + ha-ffmpeg + habluetooth + hassil + home-assistant-intents + ifaddr + mutagen + pymicro-vad + pyserial + pyspeex-noise + zeroconf + ]; # missing inputs: pycasperglow "cast" = ps: with ps; [ aiohasupervisor @@ -920,6 +948,9 @@ ps: with ps; [ pychannels ]; + "chess_com" = + ps: with ps; [ + ]; # missing inputs: chess-com-api "cisco_ios" = ps: with ps; [ pexpect @@ -1299,6 +1330,9 @@ pillow pydoods ]; + "door" = + ps: with ps; [ + ]; "doorbird" = ps: with ps; [ doorbirdpy @@ -1365,13 +1399,6 @@ "duckdns" = ps: with ps; [ ]; - "duke_energy" = - ps: with ps; [ - aiodukeenergy - fnv-hash-fast - psutil-home-assistant - sqlalchemy - ]; "dunehd" = ps: with ps; [ pdunehd @@ -1566,7 +1593,7 @@ "enocean" = ps: with ps; [ aiousbwatcher - enocean + enocean-async pyserial ]; "enphase_envoy" = @@ -1946,6 +1973,9 @@ ps: with ps; [ pyfreedompro ]; + "freshr" = + ps: with ps; [ + ]; # missing inputs: pyfreshr "fressnapf_tracker" = ps: with ps; [ fressnapftracker @@ -2009,6 +2039,9 @@ "garadget" = ps: with ps; [ ]; + "garage_door" = + ps: with ps; [ + ]; "garages_amsterdam" = ps: with ps; [ odp-amsterdam @@ -2040,6 +2073,9 @@ pyspeex-noise zeroconf ]; + "gate" = + ps: with ps; [ + ]; "gaviota" = ps: with ps; [ ]; @@ -2495,7 +2531,7 @@ pyqrcode pyturbojpeg zeroconf - ]; + ]; # missing inputs: homekit-audio-proxy "homekit_controller" = ps: with ps; [ aioesphomeapi @@ -2557,6 +2593,9 @@ ps: with ps; [ python-hpilo ]; + "hr_energy_qube" = + ps: with ps; [ + ]; # missing inputs: python-qube-heatpump "html5" = ps: with ps; [ py-vapid @@ -2608,6 +2647,9 @@ "humidifier" = ps: with ps; [ ]; + "humidity" = + ps: with ps; [ + ]; "hunterdouglas_powerview" = ps: with ps; [ aiopvapi @@ -2768,6 +2810,9 @@ defusedxml ihcsdk ]; + "illuminance" = + ps: with ps; [ + ]; "image" = ps: with ps; [ ]; @@ -2844,6 +2889,10 @@ influxdb influxdb-client ]; + "infrared" = + ps: with ps; [ + infrared-protocols + ]; "inkbird" = ps: with ps; [ aioesphomeapi @@ -3404,6 +3453,10 @@ "levoit" = ps: with ps; [ ]; + "lg_infrared" = + ps: with ps; [ + infrared-protocols + ]; "lg_netcast" = ps: with ps; [ ifaddr @@ -3421,6 +3474,9 @@ ps: with ps; [ librehardwaremonitor-api ]; + "lichess" = + ps: with ps; [ + ]; # missing inputs: aiolichess "lidarr" = ps: with ps; [ aiopyarr @@ -3526,6 +3582,9 @@ "logger" = ps: with ps; [ ]; + "lojack" = + ps: with ps; [ + ]; # missing inputs: lojack-api "london_air" = ps: with ps; [ ]; @@ -3830,9 +3889,6 @@ ps: with ps; [ mcstatus ]; - "mini_connected" = - ps: with ps; [ - ]; "minio" = ps: with ps; [ minio @@ -3907,6 +3963,9 @@ ps: with ps; [ moehlenhoff-alpha2 ]; + "moisture" = + ps: with ps; [ + ]; "mold_indicator" = ps: with ps; [ ]; @@ -3955,6 +4014,9 @@ pyspeex-noise zeroconf ]; + "motion" = + ps: with ps; [ + ]; "motion_blinds" = ps: with ps; [ ifaddr @@ -4325,6 +4387,9 @@ ps: with ps; [ pyobihai ]; + "occupancy" = + ps: with ps; [ + ]; "octoprint" = ps: with ps; [ pyoctoprintapi @@ -4420,7 +4485,7 @@ ha-ffmpeg onvif-zeep-async wsdiscovery - ]; + ]; # missing inputs: onvif_parsers "open_meteo" = ps: with ps; [ open-meteo @@ -4449,6 +4514,32 @@ "openalpr_cloud" = ps: with ps; [ ]; + "opendisplay" = + ps: with ps; [ + aioesphomeapi + aiohasupervisor + aioruuvigateway + aioshelly + aiousbwatcher + bleak + bleak-esphome + bleak-retry-connector + bluetooth-adapters + bluetooth-auto-recovery + bluetooth-data-tools + dbus-fast + esphome-dashboard-api + ha-ffmpeg + habluetooth + hassil + home-assistant-intents + ifaddr + mutagen + pymicro-vad + pyserial + pyspeex-noise + zeroconf + ]; # missing inputs: py-opendisplay "openerz" = ps: with ps; [ openerz-api @@ -4797,6 +4888,9 @@ "portlandgeneral" = ps: with ps; [ ]; + "power" = + ps: with ps; [ + ]; "powerfox" = ps: with ps; [ powerfox @@ -5828,6 +5922,9 @@ ps: with ps; [ solarlog-cli ]; + "solarman" = + ps: with ps; [ + ]; # missing inputs: solarman-opendata "solax" = ps: with ps; [ solax @@ -6203,6 +6300,9 @@ ps: with ps; [ temperusb ]; + "temperature" = + ps: with ps; [ + ]; "template" = ps: with ps; [ ]; @@ -6451,7 +6551,7 @@ ++ python-kasa.optional-dependencies.speedups; "tplink_lte" = ps: with ps; [ - ]; # missing inputs: tp-connected + ]; "tplink_omada" = ps: with ps; [ tplink-omada-client @@ -6521,6 +6621,9 @@ ps: with ps; [ triggercmd ]; + "trmnl" = + ps: with ps; [ + ]; # missing inputs: trmnl "tts" = ps: with ps; [ ha-ffmpeg @@ -6588,6 +6691,9 @@ ps: with ps; [ aiounifi ]; + "unifi_access" = + ps: with ps; [ + ]; # missing inputs: py-unifi-access "unifi_direct" = ps: with ps; [ unifi-ap @@ -6930,10 +7036,16 @@ ps: with ps; [ wiffi ]; + "wiim" = + ps: with ps; [ + ]; # missing inputs: wiim "wilight" = ps: with ps; [ pywilight ]; + "window" = + ps: with ps; [ + ]; "wirelesstag" = ps: with ps; [ wirelesstagpy @@ -7338,6 +7450,7 @@ "baf" "balboa" "bang_olufsen" + "battery" "bayesian" "binary_sensor" "blackbird" @@ -7407,6 +7520,7 @@ "deako" "debugpy" "deconz" + "decora_wifi" "default_config" "deluge" "demo" @@ -7429,6 +7543,7 @@ "dlna_dmr" "dlna_dms" "dnsip" + "door" "doorbird" "dormakaba_dkey" "downloader" @@ -7438,7 +7553,6 @@ "dsmr" "dsmr_reader" "duckdns" - "duke_energy" "dunehd" "duotecno" "dwd_weather_warnings" @@ -7539,8 +7653,10 @@ "fujitsu_fglair" "fully_kiosk" "fyta" + "garage_door" "garages_amsterdam" "gardena_bluetooth" + "gate" "gdacs" "generic" "generic_hygrostat" @@ -7617,7 +7733,6 @@ "homeassistant_sky_connect" "homeassistant_yellow" "homee" - "homekit" "homekit_controller" "homematic" "homematicip_cloud" @@ -7632,6 +7747,7 @@ "hue_ble" "huisbaasje" "humidifier" + "humidity" "hunterdouglas_powerview" "husqvarna_automower" "husqvarna_automower_ble" @@ -7649,6 +7765,7 @@ "ifttt" "igloohome" "ign_sismologia" + "illuminance" "image" "image_processing" "image_upload" @@ -7661,6 +7778,7 @@ "indevolt" "inels" "influxdb" + "infrared" "inkbird" "input_boolean" "input_button" @@ -7726,6 +7844,7 @@ "led_ble" "lektrico" "letpot" + "lg_infrared" "lg_netcast" "lg_soundbar" "lg_thinq" @@ -7807,12 +7926,14 @@ "modem_callerid" "modern_forms" "moehlenhoff_alpha2" + "moisture" "mold_indicator" "monarch_money" "monoprice" "monzo" "moon" "mopeka" + "motion" "motion_blinds" "motionblinds_ble" "motioneye" @@ -7879,6 +8000,7 @@ "nyt_games" "nzbget" "obihai" + "occupancy" "octoprint" "ohme" "ollama" @@ -7890,7 +8012,6 @@ "onedrive_for_business" "onewire" "onkyo" - "onvif" "open_meteo" "open_router" "openai_conversation" @@ -7909,6 +8030,7 @@ "opnsense" "opower" "oralb" + "orvibo" "osoenergy" "otbr" "otp" @@ -7945,6 +8067,7 @@ "pooldose" "poolsense" "portainer" + "power" "powerfox" "powerfox_local" "powerwall" @@ -8156,6 +8279,7 @@ "tellduslive" "teltonika" "temper" + "temperature" "template" "tesla_fleet" "tesla_wall_connector" @@ -8183,8 +8307,10 @@ "tomorrowio" "toon" "totalconnect" + "touchline" "touchline_sl" "tplink" + "tplink_lte" "tplink_omada" "traccar" "traccar_server" @@ -8275,6 +8401,7 @@ "whois" "wiffi" "wilight" + "window" "withings" "wiz" "wled" diff --git a/pkgs/servers/home-assistant/custom-components/browser-mod/package.nix b/pkgs/servers/home-assistant/custom-components/browser-mod/package.nix index c63b895025d2..3fa321bee017 100644 --- a/pkgs/servers/home-assistant/custom-components/browser-mod/package.nix +++ b/pkgs/servers/home-assistant/custom-components/browser-mod/package.nix @@ -10,13 +10,13 @@ buildHomeAssistantComponent rec { owner = "thomasloven"; domain = "browser_mod"; - version = "2.10.0"; + version = "2.10.2"; src = fetchFromGitHub { inherit owner; repo = "hass-browser_mod"; tag = "v${version}"; - hash = "sha256-83cwjgS4JsqZrf8sNXz6wjJOF5pGrmOZko+UfMgn70Q="; + hash = "sha256-GUYQlydFxifMR/ASJCTIfMBKh3lrB8lNDqJvHa/eVHs="; }; nativeBuildInputs = [ @@ -27,7 +27,7 @@ buildHomeAssistantComponent rec { npmDeps = fetchNpmDeps { inherit src; - hash = "sha256-JFfoqhFt1JEM4SsRkJg13QRPsjukUPs5iKpSx6Nvgzs="; + hash = "sha256-ZLWBi1EmqC1MD0O4ZQpie6IRHl6S+qGHhwonvjKGCqo="; }; npmBuildScript = "build"; diff --git a/pkgs/servers/home-assistant/custom-components/fellow/package.nix b/pkgs/servers/home-assistant/custom-components/fellow/package.nix index ef9db5551b64..dca7caeaa3d2 100644 --- a/pkgs/servers/home-assistant/custom-components/fellow/package.nix +++ b/pkgs/servers/home-assistant/custom-components/fellow/package.nix @@ -10,13 +10,13 @@ buildHomeAssistantComponent rec { owner = "NewsGuyTor"; domain = "fellow"; - version = "1.3.2"; + version = "1.3.3"; src = fetchFromGitHub { owner = "NewsGuyTor"; repo = "FellowAiden-HomeAssistant"; tag = "v${version}"; - hash = "sha256-qJizRqHcYQxcONke/++Hjh6yzHNCxfytvAJYXJWoHu8="; + hash = "sha256-n1D/kP1vxc+/kgZGwl+5nLD6IzERmMXeiQjSKZGiqvc="; }; passthru.updateScript = unstableGitUpdater { }; diff --git a/pkgs/servers/home-assistant/custom-components/ha_mcp_tools/package.nix b/pkgs/servers/home-assistant/custom-components/ha_mcp_tools/package.nix index 3b95b0649e0d..b4d17511ed30 100644 --- a/pkgs/servers/home-assistant/custom-components/ha_mcp_tools/package.nix +++ b/pkgs/servers/home-assistant/custom-components/ha_mcp_tools/package.nix @@ -8,13 +8,13 @@ buildHomeAssistantComponent rec { owner = "homeassistant-ai"; domain = "ha_mcp_tools"; - version = "6.7.1"; + version = "7.2.0"; src = fetchFromGitHub { owner = "homeassistant-ai"; repo = "ha-mcp"; tag = "v${version}"; - hash = "sha256-CQbjPEtCos0Fi6aAaIWSRMCUQKmjYviYkvJZzbCZg6Y="; + hash = "sha256-1SiWrrUSMU/Pe3vXZIPdUwpVhZM41avmjhO+PFLWmUE="; }; passthru.updateScript = nix-update-script { diff --git a/pkgs/servers/home-assistant/custom-components/home_connect_alt/package.nix b/pkgs/servers/home-assistant/custom-components/home_connect_alt/package.nix index 250ebf0491c6..84ec392731b6 100644 --- a/pkgs/servers/home-assistant/custom-components/home_connect_alt/package.nix +++ b/pkgs/servers/home-assistant/custom-components/home_connect_alt/package.nix @@ -8,13 +8,13 @@ buildHomeAssistantComponent rec { owner = "ekutner"; domain = "home_connect_alt"; - version = "1.3.4"; + version = "1.3.6"; src = fetchFromGitHub { owner = "ekutner"; repo = "home-connect-hass"; tag = version; - hash = "sha256-X6yRoEJAmBDQzEo8WeEOMFZHJ6OOpw+XUKi+iHHOgOw="; + hash = "sha256-Zi3l4bRS8O+jyrxaY8BB1XCbU9FEQSDMNE9b5DH8oCs="; }; dependencies = [ home-connect-async ]; diff --git a/pkgs/servers/home-assistant/custom-components/homematicip_local/package.nix b/pkgs/servers/home-assistant/custom-components/homematicip_local/package.nix index 94af19860cab..b306bb3c0c1f 100644 --- a/pkgs/servers/home-assistant/custom-components/homematicip_local/package.nix +++ b/pkgs/servers/home-assistant/custom-components/homematicip_local/package.nix @@ -14,13 +14,13 @@ buildHomeAssistantComponent rec { owner = "SukramJ"; domain = "homematicip_local"; - version = "2.4.1"; + version = "2.5.0"; src = fetchFromGitHub { owner = "SukramJ"; repo = "custom_homematic"; tag = version; - hash = "sha256-Hl3nvTEf70SNS0qPatddCO5MEhZfAnMONoT7ghH2U00="; + hash = "sha256-ncD72aL5+SI2CDnAHvHqbJffnEApomjC2k88VIQH9O8="; }; postPatch = '' diff --git a/pkgs/servers/home-assistant/custom-components/oref_alert/package.nix b/pkgs/servers/home-assistant/custom-components/oref_alert/package.nix index 2f8c25590ee9..d1fac2162ca0 100644 --- a/pkgs/servers/home-assistant/custom-components/oref_alert/package.nix +++ b/pkgs/servers/home-assistant/custom-components/oref_alert/package.nix @@ -15,13 +15,13 @@ buildHomeAssistantComponent rec { owner = "amitfin"; domain = "oref_alert"; - version = "6.14.0"; + version = "6.15.2"; src = fetchFromGitHub { owner = "amitfin"; repo = "oref_alert"; tag = "v${version}"; - hash = "sha256-g3Ae2AwdhcBv9v3aFjFAqxCPYVBFtQxsbtVAEOL2A60="; + hash = "sha256-2JWvTbnG8PNLLzTGAyz/u7oVCC3reHWYn9utawxIp1s="; }; # Do not publish cards, currently broken, attempting to write to nix store. diff --git a/pkgs/servers/home-assistant/custom-components/philips_airpurifier_coap/package.nix b/pkgs/servers/home-assistant/custom-components/philips_airpurifier_coap/package.nix index 01b0136bd3d7..f59856bcf4f5 100644 --- a/pkgs/servers/home-assistant/custom-components/philips_airpurifier_coap/package.nix +++ b/pkgs/servers/home-assistant/custom-components/philips_airpurifier_coap/package.nix @@ -10,13 +10,13 @@ buildHomeAssistantComponent rec { owner = "kongo09"; domain = "philips_airpurifier_coap"; - version = "0.35.0"; + version = "0.36.2"; src = fetchFromGitHub { inherit owner; repo = "philips-airpurifier-coap"; rev = "v${version}"; - hash = "sha256-PE2FmeqxX0xFlkHC8oZ09md5lBXgpkdlwIRhCVHm4+k="; + hash = "sha256-aVCfUuwPW+0L+OuOoLV0cPezZVKHtO39p/TK/gy2jdg="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/custom-components/tibber_local/package.nix b/pkgs/servers/home-assistant/custom-components/tibber_local/package.nix index 6f5cd7a0bb78..e8b272561d58 100644 --- a/pkgs/servers/home-assistant/custom-components/tibber_local/package.nix +++ b/pkgs/servers/home-assistant/custom-components/tibber_local/package.nix @@ -8,13 +8,13 @@ buildHomeAssistantComponent rec { owner = "marq24"; domain = "tibber_local"; - version = "2026.3.4"; + version = "2026.3.5"; src = fetchFromGitHub { inherit owner; repo = "ha-tibber-pulse-local"; tag = version; - sha256 = "sha256-XYcTQESAV50GX99QRWrmb57fEHOnpQuMlE/VpGlTPrQ="; + hash = "sha256-vQT0Ul4/QLQhuROENWXjSLVcml5BRWvqNIWdOLXN9dk="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/custom-components/tuya_local/package.nix b/pkgs/servers/home-assistant/custom-components/tuya_local/package.nix index 0913efe52115..a30a2ca44e31 100644 --- a/pkgs/servers/home-assistant/custom-components/tuya_local/package.nix +++ b/pkgs/servers/home-assistant/custom-components/tuya_local/package.nix @@ -11,13 +11,13 @@ buildHomeAssistantComponent rec { owner = "make-all"; domain = "tuya_local"; - version = "2026.3.2"; + version = "2026.3.3"; src = fetchFromGitHub { inherit owner; repo = "tuya-local"; tag = version; - hash = "sha256-UBVbPaRra8NDG/YotZfBg31ZNKO16XogrW1ECDo0DdA="; + hash = "sha256-cQA2lv8O/17GHLKjJktC4ox1ZEtW7ngS1X+zeJgUeHc="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/custom-components/versatile_thermostat/package.nix b/pkgs/servers/home-assistant/custom-components/versatile_thermostat/package.nix index ffe78ea45e0e..e0435a6a546a 100644 --- a/pkgs/servers/home-assistant/custom-components/versatile_thermostat/package.nix +++ b/pkgs/servers/home-assistant/custom-components/versatile_thermostat/package.nix @@ -10,13 +10,13 @@ buildHomeAssistantComponent rec { owner = "jmcollin78"; domain = "versatile_thermostat"; - version = "9.3.1"; + version = "9.3.2"; src = fetchFromGitHub { inherit owner; repo = domain; tag = version; - hash = "sha256-BdGMF4f6OfG+y6RrN7r7/GjY8OD+4eQM9syuxGI0IiI="; + hash = "sha256-fHmCakDFD6na3IQcQCX2g9XYIIJp0DTaZ9qEcSgw+78="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/package.nix b/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/package.nix index 496225940afc..cb65fb41b95e 100644 --- a/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/package.nix +++ b/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/package.nix @@ -14,13 +14,13 @@ buildHomeAssistantComponent rec { owner = "mampfes"; domain = "waste_collection_schedule"; - version = "2.11.0"; + version = "2.12.1"; src = fetchFromGitHub { inherit owner; repo = "hacs_waste_collection_schedule"; tag = version; - hash = "sha256-+yt6kjUV+fqbOa7jj603XdGX7XtI8mXnCnmUjYFNA7c="; + hash = "sha256-mR8UCDQDQBMYCxIA8DKLhD+u9utfMx+woS5L2E7mxXM="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/custom-components/yoto_ha/package.nix b/pkgs/servers/home-assistant/custom-components/yoto_ha/package.nix index b89872983ee6..307a9bc1eb08 100644 --- a/pkgs/servers/home-assistant/custom-components/yoto_ha/package.nix +++ b/pkgs/servers/home-assistant/custom-components/yoto_ha/package.nix @@ -8,13 +8,13 @@ buildHomeAssistantComponent rec { owner = "cdnninja"; domain = "yoto"; - version = "3.0.4"; + version = "3.1.0"; src = fetchFromGitHub { owner = "cdnninja"; repo = "yoto_ha"; tag = "v${version}"; - hash = "sha256-lVd5Yko9oPCcsSORYe3d8UbOOYEcqvxU37gm/NthptI="; + hash = "sha256-b2V2nHH3E0z1AE9C3m5/fXITmWusoyx0rcTIF1nD57U="; }; dependencies = [ diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix index 55baba8296cf..2a32fac3f700 100644 --- a/pkgs/servers/home-assistant/default.nix +++ b/pkgs/servers/home-assistant/default.nix @@ -253,13 +253,13 @@ let extraBuildInputs = extraPackages python.pkgs; # Don't forget to run update-component-packages.py after updating - hassVersion = "2026.3.4"; + hassVersion = "2026.4.0"; in python.pkgs.buildPythonApplication rec { pname = "homeassistant"; version = - assert (componentPackages.version == hassVersion); + #assert (componentPackages.version == hassVersion); hassVersion; pyproject = true; @@ -274,13 +274,13 @@ python.pkgs.buildPythonApplication rec { owner = "home-assistant"; repo = "core"; tag = version; - hash = "sha256-FONng6GaitzvGyXthBSPK8MioQeoDu8IRoAbXXOaS4Q="; + hash = "sha256-K/PK2i8yOqLm/GJNz5LZG8DZRKXziPzDPaguIMcKMpY="; }; # Secondary source is pypi sdist for translations sdist = fetchPypi { inherit pname version; - hash = "sha256-aK0RMnL54uwak9JCNB79iU6D+HUPRSW4a/BqKqpe8cg="; + hash = "sha256-rSckOYhEYZnmZNCfajGW3b52SMMnXvvSP+O/3jw/GuU="; }; build-system = with python.pkgs; [ @@ -416,6 +416,7 @@ python.pkgs.buildPythonApplication rec { "assist_pipeline" "frontend" "hue" + "infrared" "mobile_app" ]; diff --git a/pkgs/servers/home-assistant/frontend.nix b/pkgs/servers/home-assistant/frontend.nix index f8ac72ae2458..d3bf1d387f8e 100644 --- a/pkgs/servers/home-assistant/frontend.nix +++ b/pkgs/servers/home-assistant/frontend.nix @@ -8,7 +8,7 @@ buildPythonPackage rec { # the frontend version corresponding to a specific home-assistant version can be found here # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json pname = "home-assistant-frontend"; - version = "20260312.1"; + version = "20260325.5"; format = "wheel"; src = fetchPypi { @@ -17,7 +17,7 @@ buildPythonPackage rec { pname = "home_assistant_frontend"; dist = "py3"; python = "py3"; - hash = "sha256-WYQ0tXOFWL4D4HS1/LAx+xHCNp0oyRIIfbALe1xQMLI="; + hash = "sha256-JRQrocKeC2vYsYBYk6KLbuAZADL/57T7egLHZF/v8UI="; }; # there is nothing to strip in this package diff --git a/pkgs/servers/home-assistant/intents.nix b/pkgs/servers/home-assistant/intents.nix index 3a35ccc989d6..e768e2f97690 100644 --- a/pkgs/servers/home-assistant/intents.nix +++ b/pkgs/servers/home-assistant/intents.nix @@ -21,7 +21,7 @@ buildPythonPackage rec { pname = "home-assistant-intents"; - version = "2026.3.3"; + version = "2026.3.24"; pyproject = true; src = fetchFromGitHub { @@ -29,7 +29,7 @@ buildPythonPackage rec { repo = "intents-package"; tag = version; fetchSubmodules = true; - hash = "sha256-jueZ+GmoVcQcvCYsKQVqKdPVl4U32stcwv0N4QTspoE="; + hash = "sha256-nwKMg5O/QnYFFviwg1vC++NoQfMpHHK0WoJaxa1xDwE="; }; build-system = [ diff --git a/pkgs/servers/home-assistant/pytest-homeassistant-custom-component.nix b/pkgs/servers/home-assistant/pytest-homeassistant-custom-component.nix index 890dcacef42d..19d22ca3234a 100644 --- a/pkgs/servers/home-assistant/pytest-homeassistant-custom-component.nix +++ b/pkgs/servers/home-assistant/pytest-homeassistant-custom-component.nix @@ -18,7 +18,7 @@ buildPythonPackage rec { pname = "pytest-homeassistant-custom-component"; - version = "0.13.320"; + version = "0.13.321"; pyproject = true; disabled = pythonOlder "3.13"; @@ -27,7 +27,7 @@ buildPythonPackage rec { owner = "MatthewFlamm"; repo = "pytest-homeassistant-custom-component"; tag = version; - hash = "sha256-VweH6SWDYO9m0g2MS8awK00DwiflfPpyLep79U60uWw="; + hash = "sha256-slmIxLRbicyzYhnYmefLnPcqq//wRjmJ5xGeJBYxacQ="; }; build-system = [ setuptools ]; diff --git a/pkgs/servers/home-assistant/stubs.nix b/pkgs/servers/home-assistant/stubs.nix index 9842f43cc811..1d55b1308db5 100644 --- a/pkgs/servers/home-assistant/stubs.nix +++ b/pkgs/servers/home-assistant/stubs.nix @@ -10,7 +10,7 @@ buildPythonPackage rec { pname = "homeassistant-stubs"; - version = "2026.3.4"; + version = "2026.4.0"; pyproject = true; disabled = python.version != home-assistant.python.version; @@ -19,7 +19,7 @@ buildPythonPackage rec { owner = "KapJI"; repo = "homeassistant-stubs"; tag = version; - hash = "sha256-yqp/KNhMIfFTlXYWv8lgALNB6soaHOyZvA1gFExYowo="; + hash = "sha256-uD9+WkhRwwr5l4pKpg7GosTsLqgGCTQA6u3mN+XBhio="; }; build-system = [ diff --git a/pkgs/servers/home-assistant/tests.nix b/pkgs/servers/home-assistant/tests.nix index 9243882d503f..be6d910824f3 100644 --- a/pkgs/servers/home-assistant/tests.nix +++ b/pkgs/servers/home-assistant/tests.nix @@ -39,7 +39,7 @@ let ]; emulated_kasa = getComponentDeps "camera" ++ getComponentDeps "conversation"; environment_canada = getComponentDeps "camera"; - esphome = getComponentDeps "camera"; + esphome = getComponentDeps "camera" ++ getComponentDeps "infrared"; fan = getComponentDeps "conversation"; fish_audio = getComponentDeps "tts"; foscam = getComponentDeps "camera"; @@ -60,7 +60,7 @@ let ibeacon-ble ]; gpslogger = getComponentDeps "assist_pipeline" ++ getComponentDeps "camera"; - group = getComponentDeps "camera" ++ getComponentDeps "conversation"; + group = getComponentDeps "camera" ++ getComponentDeps "conversation" ++ getComponentDeps "infrared"; hassio = getComponentDeps "frontend" ++ getComponentDeps "homeassistant_yellow"; hikvision = getComponentDeps "camera"; homeassistant = getComponentDeps "camera" ++ getComponentDeps "conversation"; @@ -77,6 +77,7 @@ let image_processing = getComponentDeps "conversation"; intelliclima = getComponentDeps "intellifire"; intent = getComponentDeps "conversation"; + kitchen_sink = getComponentDeps "infrared"; light = getComponentDeps "conversation"; local_file = getComponentDeps "camera"; locative = getComponentDeps "assist_pipeline" ++ getComponentDeps "camera"; @@ -204,19 +205,6 @@ let # sandbox doesn't grant access to /sys/class/power_supply "tests/components/systemmonitor/test_config_flow.py::test_add_and_remove_processes" ]; - trane = [ - # TraneConfigFlow doesn't support step reauth - "tests/components/trane/test_init.py::test_setup_auth_error" - ]; - tuya = [ - # entity ordering in diagnostics is non-deterministic; fixed upstream in - # https://github.com/home-assistant/core/pull/164819 (landing in HA 2026.4) - "tests/components/tuya/test_diagnostics.py" - ]; - youtube = [ - # outdated snapshot - "tests/components/youtube/test_sensor.py::test_sensor" - ]; }; extraDisabledTests = { @@ -224,12 +212,14 @@ let # intent fixture mismatch "test_error_no_device_on_floor" ]; - homewizard = [ - # Messages don't match expected due to a change in Homewizard's outputs - "test_identify_button" - "test_number_entities" - "test_select_request_error" - "test_switch_entities" + ecovacs = [ + # Translation not found for vacuum + "test_raise_segment_changed_issue" + ]; + roborock = [ + # Translation not found for vacuum + "test_clean_segments_mixed_maps" + "test_segments_changed_issue" ]; sensor = [ # Failed: Translation not found for sensor @@ -246,11 +236,9 @@ let # tries to retrieve file from github "test_non_text_stdout_capture" ]; - tuya = [ - # snapshot mismatches: PyPI sdist translations differ from strings.json - # ("Power-on behavior" vs "Power on behavior"); expected to resolve in HA 2026.4 - "test_device_diagnostics[tdq_9htyiowaf5rtdhrv]" - "test_platform_setup_and_discovery" + vacuum = [ + # Translation not found for vacuum + "test_segments_changed_issue" ]; zeroconf = [ # multicast socket bind, not possible in the sandbox diff --git a/pkgs/top-level/python-aliases.nix b/pkgs/top-level/python-aliases.nix index 16c34fd10658..45ecd7aa94db 100644 --- a/pkgs/top-level/python-aliases.nix +++ b/pkgs/top-level/python-aliases.nix @@ -106,6 +106,7 @@ mapAliases { beancount_docverif = throw "'beancount_docverif' has been renamed to/replaced by 'beancount-docverif'"; # Converted to throw 2025-10-29 beets-stable = lib.warn "beets-stable was aliased to beets, since upstream releases are frequent nowadays" self.beets; # added 2025-10-16 beets-unstable = lib.warn "beets-unstable was aliased to beets, since upstream releases are frequent nowadays" self.beets; # added 2025-10-16 + bimmer-connected = throw "'bimmer-connected' was removed because BMW started blocking third parties"; # added 2026-03-30 bip_utils = throw "'bip_utils' has been renamed to/replaced by 'bip-utils'"; # Converted to throw 2025-10-29 bjoern = throw "'bjoern' has been removed, as the upstream repository was unmaintained and it was using libraries with severe security issues."; # Added 2025-09-01 bkcharts = throw "'bkcharts' has been removed as the upstream repository was archived in 2018"; # added 2025-08-26 @@ -188,6 +189,7 @@ mapAliases { elegy = throw "elegy has been removed because it has transitively been marked as broken since 2023."; # Added 2025-10-11 email_validator = throw "'email_validator' has been renamed to/replaced by 'email-validator'"; # Converted to throw 2025-10-29 embreex = throw "embreex has been removed, as it required embree2"; # added 2025-09-14 + enocean = throw "'enocean' was removed because Home Assistant switched to 'enocean-async'"; # added 2026-03-31 eris = throw "eris has been removed due to a hostile upstream moving tags and breaking src FODs"; # Added 2025-09-01 et_xmlfile = throw "'et_xmlfile' has been renamed to/replaced by 'et-xmlfile'"; # Converted to throw 2025-10-29 ev3dev2 = throw "'ev3dev2' has been renamed to/replaced by 'python-ev3dev2'"; # Converted to throw 2025-10-29 diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index c8c2c5814d78..5b86108614ef 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2034,8 +2034,6 @@ self: super: with self; { billiard = callPackage ../development/python-modules/billiard { }; - bimmer-connected = callPackage ../development/python-modules/bimmer-connected { }; - binance-connector = callPackage ../development/python-modules/binance-connector { }; binary = callPackage ../development/python-modules/binary { }; @@ -5014,7 +5012,7 @@ self: super: with self; { enlighten = callPackage ../development/python-modules/enlighten { }; - enocean = callPackage ../development/python-modules/enocean { }; + enocean-async = callPackage ../development/python-modules/enocean-async { }; enochecker-core = callPackage ../development/python-modules/enochecker-core { }; @@ -7529,6 +7527,8 @@ self: super: with self; { inform = callPackage ../development/python-modules/inform { }; + infrared-protocols = callPackage ../development/python-modules/infrared-protocols { }; + ingredient-parser-nlp = callPackage ../development/python-modules/ingredient-parser-nlp { }; iniconfig = callPackage ../development/python-modules/iniconfig { }; @@ -19000,6 +19000,8 @@ self: super: with self; { tellduslive = callPackage ../development/python-modules/tellduslive { }; + telnetlib3 = callPackage ../development/python-modules/telnetlib3 { }; + teltasync = callPackage ../development/python-modules/teltasync { }; temescal = callPackage ../development/python-modules/temescal { };