summary refs log tree commit diff
path: root/pkgs/servers/home-assistant/default.nix
blob: 643b0d70a26c1c7e0071efbeb05ad9091e9699e2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{ lib, fetchFromGitHub, fetchpatch, python3

# Look up dependencies of specified components in component-packages.nix
, extraComponents ? []

# Additional packages to add to propagatedBuildInputs
, extraPackages ? ps: []

# Skip pip install of required packages on startup
, skipPip ? true }:

let

  py = python3.override {
    # Override the version of some packages pinned in Home Assistant's setup.py
    packageOverrides = self: super: {
      aiohttp = super.aiohttp.overridePythonAttrs (oldAttrs: rec {
        version = "3.3.2";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "f20deec7a3fbaec7b5eb7ad99878427ad2ee4cc16a46732b705e8121cbb3cc12";
        };
      });
      requests = super.requests.overridePythonAttrs (oldAttrs: rec {
        version = "2.19.1";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a";
        };
      });
      voluptuous = super.voluptuous.overridePythonAttrs (oldAttrs: rec {
        version = "0.11.5";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "567a56286ef82a9d7ae0628c5842f65f516abcb496e74f3f59f1d7b28df314ef";
        };
      });
      attrs = super.attrs.overridePythonAttrs (oldAttrs: rec {
        version = "18.1.0";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "e0d0eb91441a3b53dab4d9b743eafc1ac44476296a2053b6ca3af0b139faf87b";
        };
      });
      astral = super.astral.overridePythonAttrs (oldAttrs: rec {
        version = "1.6.1";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "ab0c08f2467d35fcaeb7bad15274743d3ac1ad18b5391f64a0058a9cd192d37d";
        };
      });
      # used by check_config script
      # can be unpinned once https://github.com/home-assistant/home-assistant/issues/11917 is resolved
      colorlog = super.colorlog.overridePythonAttrs (oldAttrs: rec {
        version = "3.1.4";
        src = oldAttrs.src.override {
          inherit version;
          sha256 = "418db638c9577f37f0fae4914074f395847a728158a011be2a193ac491b9779d";
        };
      });
      hass-frontend = super.callPackage ./frontend.nix { };
    };
  };

  componentPackages = import ./component-packages.nix;

  availableComponents = builtins.attrNames componentPackages.components;

  getPackages = component: builtins.getAttr component componentPackages.components;

  componentBuildInputs = lib.concatMap (component: getPackages component py.pkgs) extraComponents;

  # Ensure that we are using a consistent package set
  extraBuildInputs = extraPackages py.pkgs;

  # Don't forget to run parse-requirements.py after updating
  hassVersion = "0.75.1";

in with py.pkgs; buildPythonApplication rec {
  pname = "homeassistant";
  version = assert (componentPackages.version == hassVersion); hassVersion;

  disabled = pythonOlder "3.5";

  inherit availableComponents;

  # PyPI tarball is missing tests/ directory
  src = fetchFromGitHub {
    owner = "home-assistant";
    repo = "home-assistant";
    rev = version;
    sha256 = "1slm2r48yh4l57wnvalin6mnk3id2phsaqpd4qy0c0ksqc61ffqk";
  };

  # Upgrade voluptuous to 0.11.5
  # Needed because voluptuous-0.11.3 requires pypandoc
  # See https://github.com/home-assistant/home-assistant/pull/15830#issuecomment-410485197
  patches = fetchpatch {
    name = "upgrade-voluptuous.patch";
    url = https://github.com/home-assistant/home-assistant/commit/9ea3be4dc112fb45544fa089cb367c7f4f91b5f0.patch;
    sha256 = "0wacs9aifdysw6jpz86d6cqah8spi48pwwcbydj9l8zxndzqp6na";
  };

  propagatedBuildInputs = [
    # From setup.py
    requests pyyaml pytz pip jinja2 voluptuous typing aiohttp async-timeout astral certifi attrs
    # From http, frontend, recorder and config.config_entries components
    sqlalchemy aiohttp-cors hass-frontend voluptuous-serialize
  ] ++ componentBuildInputs ++ extraBuildInputs;

  checkInputs = [
    pytest requests-mock pydispatcher pytest-aiohttp
  ];

  checkPhase = ''
    # The components' dependencies are not included, so they cannot be tested
    py.test --ignore tests/components
    # Some basic components should be tested however
    py.test \
      tests/components/{group,http,frontend} \
      tests/components/test_{api,configurator,demo,discovery,init,introduction,logger,script,shell_command,system_log,websocket_api}.py
  '';

  makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";

  meta = with lib; {
    homepage = https://home-assistant.io/;
    description = "Open-source home automation platform running on Python 3";
    license = licenses.asl20;
    maintainers = with maintainers; [ f-breidenstein dotlambda ];
  };
}