1{
2 lib,
3 buildPythonPackage,
4 fetchFromGitHub,
5 pythonOlder,
6 stdenvNoCC,
7 substituteAll,
8
9 # build
10 setuptools,
11 pythonRelaxDepsHook,
12
13 # propagates
14 aiohttp,
15 aiorun,
16 async-timeout,
17 coloredlogs,
18 dacite,
19 orjson,
20 home-assistant-chip-clusters,
21
22 # optionals
23 cryptography,
24 home-assistant-chip-core,
25 zeroconf,
26
27 # tests
28 python,
29 pytest,
30 pytest-aiohttp,
31 pytestCheckHook,
32}:
33
34let
35 paaCerts = stdenvNoCC.mkDerivation rec {
36 pname = "matter-server-paa-certificates";
37 version = "1.2.0.1";
38
39 src = fetchFromGitHub {
40 owner = "project-chip";
41 repo = "connectedhomeip";
42 rev = "refs/tags/v${version}";
43 hash = "sha256-p3P0n5oKRasYz386K2bhN3QVfN6oFndFIUWLEUWB0ss=";
44 };
45
46 installPhase = ''
47 runHook preInstall
48
49 mkdir -p $out
50 cp $src/credentials/development/paa-root-certs/* $out/
51
52 runHook postInstall
53 '';
54 };
55in
56
57buildPythonPackage rec {
58 pname = "python-matter-server";
59 version = "5.10.0";
60 format = "pyproject";
61
62 disabled = pythonOlder "3.10";
63
64 src = fetchFromGitHub {
65 owner = "home-assistant-libs";
66 repo = "python-matter-server";
67 rev = "refs/tags/${version}";
68 hash = "sha256-rfpGclSgCBTxlTgVqgNz3ixoldB9M+6mLmogkNDDdWs=";
69 };
70
71 patches = [
72 (substituteAll {
73 src = ./link-paa-root-certs.patch;
74 paacerts = paaCerts;
75 })
76 ];
77
78 postPatch = ''
79 substituteInPlace pyproject.toml \
80 --replace 'version = "0.0.0"' 'version = "${version}"' \
81 --replace '--cov' ""
82 '';
83
84 nativeBuildInputs = [
85 setuptools
86 pythonRelaxDepsHook
87 ];
88
89 pythonRelaxDeps = [ "home-assistant-chip-clusters" ];
90
91 propagatedBuildInputs = [
92 aiohttp
93 aiorun
94 async-timeout
95 coloredlogs
96 dacite
97 orjson
98 home-assistant-chip-clusters
99 ];
100
101 passthru.optional-dependencies = {
102 server = [
103 cryptography
104 home-assistant-chip-core
105 zeroconf
106 ];
107 };
108
109 nativeCheckInputs = [
110 pytest-aiohttp
111 pytestCheckHook
112 ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
113
114 preCheck =
115 let
116 pythonEnv = python.withPackages (_: propagatedBuildInputs ++ nativeCheckInputs ++ [ pytest ]);
117 in
118 ''
119 export PYTHONPATH=${pythonEnv}/${python.sitePackages}
120 '';
121
122 pytestFlagsArray = [
123 # Upstream theymselves limit the test scope
124 # https://github.com/home-assistant-libs/python-matter-server/blob/main/.github/workflows/test.yml#L65
125 "tests/server"
126 ];
127
128 meta = with lib; {
129 changelog = "https://github.com/home-assistant-libs/python-matter-server/releases/tag/${version}";
130 description = "Python server to interact with Matter";
131 mainProgram = "matter-server";
132 homepage = "https://github.com/home-assistant-libs/python-matter-server";
133 license = licenses.asl20;
134 maintainers = teams.home-assistant.members;
135 };
136}