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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
{ stdenv, nixosTests, lib, fetchurl, fetchFromGitHub, fetchpatch, python3, protobuf3_6
# Look up dependencies of specified components in component-packages.nix
, extraComponents ? [ ]
# Additional packages to add to propagatedBuildInputs
, extraPackages ? ps: []
# Override Python packages using
# self: super: { pkg = super.pkg.overridePythonAttrs (oldAttrs: { ... }); }
# Applied after defaultOverrides
, packageOverrides ? self: super: {
# TODO: Remove this override after updating to cryptography 2.8:
}
# Skip pip install of required packages on startup
, skipPip ? true }:
let
defaultOverrides = [
# Override the version of some packages pinned in Home Assistant's setup.py
# required by the sun/moon plugins
# https://github.com/home-assistant/core/issues/36636
(mkOverride "astral" "1.10.1"
"d2a67243c4503131c856cafb1b1276de52a86e5b8a1d507b7e08bee51cb67bf1")
# We have 3.x in nixpkgs which is incompatible with home-assistant atm:
# https://github.com/home-assistant/core/blob/dev/requirements_all.txt
(mkOverride "pyowm" "2.10.0"
"1xvcv3sbcn9na8cwz21nnjlixysfk5lymnf65d1nqkbgacc1mm4g")
(mkOverride "bcrypt" "3.1.7"
"0hhywhxx301cxivgxrpslrangbfpccc8y83qbwn1f57cab3nj00b")
# hass-frontend does not exist in python3.pkgs
(self: super: {
hass-frontend = self.callPackage ./frontend.nix { };
})
];
mkOverride = attrname: version: sha256:
self: super: {
${attrname} = super.${attrname}.overridePythonAttrs (oldAttrs: {
inherit version;
src = oldAttrs.src.override {
inherit version sha256;
};
});
};
py = python3.override {
# Put packageOverrides at the start so they are applied after defaultOverrides
packageOverrides = lib.foldr lib.composeExtensions (self: super: { }) ([ packageOverrides ] ++ defaultOverrides);
};
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.115.6";
in with py.pkgs; buildPythonApplication rec {
pname = "homeassistant";
version = assert (componentPackages.version == hassVersion); hassVersion;
disabled = pythonOlder "3.5";
patches = [
./relax-dependencies.patch
./fix-media-path-test.patch
];
inherit availableComponents;
# PyPI tarball is missing tests/ directory
src = fetchFromGitHub {
owner = "home-assistant";
repo = "core";
rev = version;
sha256 = "07j54glcpa5ngkr0pwdg44f8gas3jz3nh653mr5sb5wg7xspgcr8";
};
postPatch = ''
substituteInPlace setup.py \
--replace "yarl==1.4.2" "yarl~=1.4"
'';
propagatedBuildInputs = [
# From setup.py
aiohttp astral async-timeout attrs bcrypt certifi importlib-metadata jinja2
pyjwt cryptography pip python-slugify pytz pyyaml requests ruamel_yaml
setuptools voluptuous voluptuous-serialize
# From frontend, image, http and recorder components and auth.mfa_modules.totp
sqlalchemy aiohttp-cors hass-frontend pillow pyotp pyqrcode ciso8601
] ++ componentBuildInputs ++ extraBuildInputs;
# upstream only tests on Linux, so do we.
doCheck = stdenv.isLinux;
checkInputs = [
asynctest pytest pytest-aiohttp requests-mock hass-nabucasa netdisco pydispatcher
];
checkPhase = ''
# the tests require the existance of a media dir
mkdir /build/media
# - components' dependencies are not included, so they cannot be tested
# - test_merge_id_schema requires pyqwikswitch
# - test_loader.py tries to load not-packaged dependencies
# - test_notify pyotp doesn't like the short mock keys
# - unclear why test_merge fails: assert merge_log_err.call_count != 0
# - test_setup_safe_mode_if_no_frontend: requires dependencies for components we have not packaged
py.test \
--ignore tests/components \
--ignore tests/test_loader.py \
--ignore tests/auth/mfa_modules/test_notify.py \
-k "not test_setup_safe_mode_if_no_frontend and not test_merge_id_schema and not test_merge"
# Some basic components should be tested however
py.test \
tests/components/{api,config,configurator,demo,discovery,frontend,group,history} \
tests/components/{homeassistant,http,logger,script,shell_command,system_log,websocket_api}
'';
makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";
passthru = {
inherit (py.pkgs) hass-frontend;
tests = {
inherit (nixosTests) home-assistant;
};
};
meta = with lib; {
homepage = "https://home-assistant.io/";
description = "Open-source home automation platform running on Python 3";
license = licenses.asl20;
maintainers = with maintainers; [ dotlambda globin mic92 hexa ];
};
}
|