about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/home-assistant/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/home-assistant/default.nix')
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/default.nix249
1 files changed, 225 insertions, 24 deletions
diff --git a/nixpkgs/pkgs/servers/home-assistant/default.nix b/nixpkgs/pkgs/servers/home-assistant/default.nix
index fae857fda5dc..0c58caa29228 100644
--- a/nixpkgs/pkgs/servers/home-assistant/default.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/default.nix
@@ -1,4 +1,8 @@
-{ stdenv, nixosTests, lib, fetchFromGitHub, python3
+{ stdenv
+, lib
+, fetchFromGitHub
+, python3
+, nixosTests
 
 # Look up dependencies of specified components in component-packages.nix
 , extraComponents ? [ ]
@@ -9,8 +13,7 @@
 # Override Python packages using
 # self: super: { pkg = super.pkg.overridePythonAttrs (oldAttrs: { ... }); }
 # Applied after defaultOverrides
-, packageOverrides ? self: super: {
-}
+, packageOverrides ? self: super: {}
 
 # Skip pip install of required packages on startup
 , skipPip ? true }:
@@ -24,6 +27,41 @@ let
     (mkOverride "astral" "1.10.1"
       "d2a67243c4503131c856cafb1b1276de52a86e5b8a1d507b7e08bee51cb67bf1")
 
+    # Pinned due to API changes in iaqualink>=2.0, remove after
+    # https://github.com/home-assistant/core/pull/48137 was merged
+    (self: super: {
+      iaqualink = super.iaqualink.overridePythonAttrs (oldAttrs: rec {
+        version = "0.3.4";
+        src = fetchFromGitHub {
+          owner = "flz";
+          repo = "iaqualink-py";
+          rev = "v${version}";
+          sha256 = "16mn6nd9x3hm6j6da99qhwbqs95hh8wx21r1h1m9csl76z77n9lh";
+        };
+        checkInputs = oldAttrs.checkInputs ++ [ python3.pkgs.asynctest ];
+      });
+    })
+
+    # Pinned due to API changes in pylilterbot>=2021.3.0
+    (self: super: {
+      pylitterbot = super.pylitterbot.overridePythonAttrs (oldAttrs: rec {
+        version = "2021.2.8";
+        src = fetchFromGitHub {
+          owner = "natekspencer";
+          repo = "pylitterbot";
+          rev = version;
+          sha256 = "142lhijm51v11cd0lhcfdnjdd143jxi2hjsrqdq0rrbbnmj6mymp";
+        };
+        # had no tests before 2021.3.0
+        doCheck = false;
+      });
+    })
+
+    # Pinned due to bug in ring-doorbell 0.7.0
+    # https://github.com/tchellomello/python-ring-doorbell/issues/240
+    (mkOverride "ring-doorbell" "0.6.2"
+      "fbd537722a27b3b854c26506d894b7399bb8dc57ff36083285971227a2d46560")
+
     # hass-frontend does not exist in python3.pkgs
     (self: super: {
       hass-frontend = self.callPackage ./frontend.nix { };
@@ -57,14 +95,14 @@ let
   extraBuildInputs = extraPackages py.pkgs;
 
   # Don't forget to run parse-requirements.py after updating
-  hassVersion = "2021.2.3";
+  hassVersion = "2021.4.0";
 
 in with py.pkgs; buildPythonApplication rec {
   pname = "homeassistant";
   version = assert (componentPackages.version == hassVersion); hassVersion;
 
   # check REQUIRED_PYTHON_VER in homeassistant/const.py
-  disabled = pythonOlder "3.7.1";
+  disabled = pythonOlder "3.8";
 
   # don't try and fail to strip 6600+ python files, it takes minutes!
   dontStrip = true;
@@ -76,22 +114,22 @@ in with py.pkgs; buildPythonApplication rec {
     owner = "home-assistant";
     repo = "core";
     rev = version;
-    sha256 = "0s1jcd94wwvmvzq86w8s9dwfvnmjs9l661z9pc6kwgagggjjgd8c";
+    sha256 = "1gkbkyxqsw3isdyskzi0ib07fgqvirnr20jkhrz86vl0k9ix8hwf";
   };
 
   # leave this in, so users don't have to constantly update their downstream patch handling
-  patches = [];
+  patches = [
+  ];
 
   postPatch = ''
     substituteInPlace setup.py \
-      --replace "attrs==19.3.0" "attrs>=19.3.0" \
-      --replace "bcrypt==3.1.7" "bcrypt>=3.1.7" \
-      --replace "cryptography==3.2" "cryptography" \
+      --replace "awesomeversion==21.2.3" "awesomeversion" \
+      --replace "bcrypt==3.1.7" "bcrypt" \
+      --replace "cryptography==3.3.2" "cryptography" \
       --replace "pip>=8.0.3,<20.3" "pip" \
-      --replace "pytz>=2020.5" "pytz>=2020.4" \
+      --replace "pytz>=2021.1" "pytz" \
       --replace "pyyaml==5.4.1" "pyyaml" \
-      --replace "requests==2.25.1" "requests>=2.25.0" \
-      --replace "ruamel.yaml==0.15.100" "ruamel.yaml>=0.15.100"
+      --replace "ruamel.yaml==0.15.100" "ruamel.yaml"
     substituteInPlace tests/test_config.py --replace '"/usr"' '"/build/media"'
   '';
 
@@ -121,6 +159,8 @@ in with py.pkgs; buildPythonApplication rec {
     yarl
   ] ++ componentBuildInputs ++ extraBuildInputs;
 
+  makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";
+
   # upstream only tests on Linux, so do we.
   doCheck = stdenv.isLinux;
 
@@ -128,86 +168,246 @@ in with py.pkgs; buildPythonApplication rec {
     # test infrastructure
     asynctest
     pytest-aiohttp
+    pytest-rerunfailures
     pytest-xdist
     pytestCheckHook
     requests-mock
     # component dependencies
     pyotp
+    respx
   ] ++ lib.concatMap (component: getPackages component py.pkgs) componentTests;
 
-  # We cannot test all components, since they'd introduce lots of dependencies, some of which are unpackaged,
-  # but we should test very common stuff, like what's in `default_config`.
-  # https://github.com/home-assistant/core/commits/dev/homeassistant/components/default_config/manifest.json
+  # We can reasonably test components that don't communicate with any network
+  # services. Before adding new components to this list make sure we have all
+  # its dependencies packaged and listed in ./component-packages.nix.
   componentTests = [
+    "accuweather"
+    "airly"
+    "analytics"
+    "alert"
     "api"
+    "auth"
     "automation"
+    "axis"
+    "bayesian"
+    "binary_sensor"
+    "caldav"
+    "calendar"
+    "camera"
+    "cast"
+    "climate"
+    "cloud"
+    "command_line"
     "config"
     "configurator"
+    "conversation"
     "counter"
+    "cover"
+    "deconz"
     "default_config"
     "demo"
+    "derivative"
+    "device_automation"
+    "device_sun_light_trigger"
+    "device_tracker"
+    "devolo_home_control"
     "dhcp"
     "discovery"
+    "emulated_hue"
+    "esphome"
+    "fan"
+    "faa_delays"
+    "ffmpeg"
+    "file"
+    "filesize"
+    "filter"
+    "flux"
+    "folder"
+    "folder_watcher"
+    "freebox"
+    "fritzbox"
+    "fritzbox_callmonitor"
     "frontend"
+    "generic"
+    "generic_thermostat"
+    "geo_json_events"
+    "geo_location"
     "group"
+    "hddtemp"
     "history"
+    "history_stats"
+    "home_plus_control"
+    "homekit"
+    "homekit_controller"
     "homeassistant"
+    "homematic"
+    "html5"
     "http"
     "hue"
+    "iaqualink"
+    "ifttt"
+    "image"
+    "image_processing"
+    "influxdb"
     "input_boolean"
     "input_datetime"
     "input_text"
     "input_number"
     "input_select"
+    "intent"
+    "intent_script"
+    "ipp"
+    "kmtronic"
+    "light"
+    "litterrobot"
+    "local_file"
+    "local_ip"
+    "lock"
     "logbook"
+    "logentries"
     "logger"
+    "lovelace"
+    "manual"
+    "manual_mqtt"
+    "mazda"
+    "media_player"
     "media_source"
+    "met"
+    "minecraft_server"
     "mobile_app"
+    "modbus"
+    "moon"
+    "mqtt"
+    "mqtt_eventstream"
+    "mqtt_json"
+    "mqtt_room"
+    "mqtt_statestream"
+    "mullvad"
+    "notify"
+    "notion"
+    "number"
+    "ozw"
+    "panel_custom"
+    "panel_iframe"
+    "persistent_notification"
     "person"
+    "plaato"
+    "prometheus"
+    "proximity"
+    "push"
+    "python_script"
+    "random"
+    "recorder"
+    "rest"
+    "rest_command"
+    "rituals_perfume_genie"
+    "rmvtransport"
+    "rss_feed_template"
+    "safe_mode"
     "scene"
+    "screenlogic"
     "script"
+    "search"
     "shell_command"
+    "shopping_list"
+    "simplisafe"
+    "simulated"
+    "sma"
+    "sensor"
+    "smarttub"
+    "smtp"
+    "smappee"
+    "solaredge"
+    "sonos"
+    "spotify"
+    "sql"
     "ssdp"
+    "stream"
+    "subaru"
     "sun"
+    "switch"
     "system_health"
     "system_log"
     "tag"
+    "tasmota"
+    "tcp"
+    "template"
+    "threshold"
+    "time_date"
     "timer"
+    "tod"
+    "trace"
+    "tts"
+    "universal"
+    "updater"
+    "upnp"
+    "uptime"
+    "vacuum"
+    "verisure"
+    "weather"
     "webhook"
     "websocket_api"
+    "wled"
+    "workday"
+    "worldclock"
     "zeroconf"
+    "zha"
     "zone"
     "zwave"
   ];
 
   pytestFlagsArray = [
     # limit amout of runners to reduce race conditions
-    "-n 2"
+    "-n auto"
+    # retry racy tests that end in "RuntimeError: Event loop is closed"
+    "--reruns 3"
+    "--only-rerun RuntimeError"
     # assign tests grouped by file to workers
     "--dist loadfile"
-    # don't bulk test all components
-    "--ignore tests/components"
-    # pyotp since v2.4.0 complains about the short mock keys, hass pins v2.3.0
-    "--ignore tests/auth/mfa_modules/test_notify.py"
+    # tests are located in tests/
     "tests"
+    # screenlogic/test_config_flow.py: Tries to send out UDP broadcasts
+    "--deselect tests/components/screenlogic/test_config_flow.py::test_form_cannot_connect"
+    # dynamically add packages required for component tests
   ] ++ map (component: "tests/components/" + component) componentTests;
 
+  disabledTestPaths = [
+    # don't bulk test all components
+    "tests/components"
+    # pyotp since v2.4.0 complains about the short mock keys, hass pins v2.3.0
+    "tests/auth/mfa_modules/test_notify.py"
+  ];
+
   disabledTests = [
     # AssertionError: assert 1 == 0
+    "test_error_posted_as_event"
     "test_merge"
     # ModuleNotFoundError: No module named 'pyqwikswitch'
     "test_merge_id_schema"
     # keyring.errors.NoKeyringError: No recommended backend was available.
     "test_secrets_from_unrelated_fails"
     "test_secrets_credstash"
+    # generic/test_camera.py: AssertionError: 500 == 200
+    "test_fetching_without_verify_ssl"
+    "test_fetching_url_with_verify_ssl"
+    # util/test_package.py: AssertionError on package.is_installed('homeassistant>=999.999.999')
+    "test_check_package_version_does_not_match"
   ];
 
   preCheck = ''
+    export HOME="$TEMPDIR"
+
     # the tests require the existance of a media dir
     mkdir /build/media
-  '';
 
-  makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";
+    # error out when component test directory is missing, otherwise hidden by xdist execution :(
+    for component in ${lib.concatStringsSep " " (map lib.escapeShellArg componentTests)}; do
+      test -d "tests/components/$component" || {
+        >2& echo "ERROR: Tests for component '$component' were enabled, but they do not exist!"
+        exit 1
+      }
+    done
+  '';
 
   passthru = {
     inherit (py.pkgs) hass-frontend;
@@ -220,6 +420,7 @@ in with py.pkgs; buildPythonApplication rec {
     homepage = "https://home-assistant.io/";
     description = "Open source home automation that puts local control and privacy first";
     license = licenses.asl20;
-    maintainers = with maintainers; [ dotlambda globin mic92 hexa ];
+    maintainers = teams.home-assistant.members;
+    platforms = platforms.linux;
   };
 }