pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / tools / misc / esphome / default.nix
blobb30cc6101209059e96c8ee98b85bdee789d26355
1 { lib
2 , callPackage
3 , python3Packages
4 , fetchFromGitHub
5 , installShellFiles
6 , platformio
7 , esptool
8 , git
9 , inetutils
10 , stdenv
11 , nixosTests
14 let
15   python = python3Packages.python.override {
16     self = python;
17     packageOverrides = self: super: {
18       esphome-dashboard = self.callPackage ./dashboard.nix { };
19     };
20   };
22 python.pkgs.buildPythonApplication rec {
23   pname = "esphome";
24   version = "2024.10.2";
25   pyproject = true;
27   src = fetchFromGitHub {
28     owner = pname;
29     repo = pname;
30     rev = "refs/tags/${version}";
31     hash = "sha256-WEsFgmwH6OGkAn1c0h/HBhBJr2329YHSKMZzjEDTKNg=";
32   };
34   build-systems = with python.pkgs; [
35     setuptools
36     argcomplete
37   ];
39   nativeBuildInputs = [
40     installShellFiles
41   ];
43   pythonRelaxDeps = true;
45   pythonRemoveDeps = [
46     "esptool"
47     "platformio"
48   ];
50   postPatch = ''
51     substituteInPlace pyproject.toml \
52       --replace-fail "setuptools==" "setuptools>=" \
53       --replace-fail "wheel~=" "wheel>="
55     # ensure component dependencies are available
56     cat requirements_optional.txt >> requirements.txt
57     # relax strict runtime version check
58     substituteInPlace esphome/components/font/__init__.py \
59       --replace-fail "10.2.0" "${python.pkgs.pillow.version}"
60   '';
62   # Remove esptool and platformio from requirements
63   env.ESPHOME_USE_SUBPROCESS = "";
65   # esphome has optional dependencies it does not declare, they are
66   # loaded when certain config blocks are used, like `font`, `image`
67   # or `animation`.
68   # They have validation functions like:
69   # - validate_cryptography_installed
70   # - validate_pillow_installed
71   dependencies = with python.pkgs; [
72     aioesphomeapi
73     argcomplete
74     cairosvg
75     click
76     colorama
77     cryptography
78     esphome-dashboard
79     icmplib
80     kconfiglib
81     packaging
82     paho-mqtt
83     pillow
84     platformio
85     protobuf
86     puremagic
87     pyparsing
88     pyserial
89     pyyaml
90     requests
91     ruamel-yaml
92     tornado
93     tzdata
94     tzlocal
95     voluptuous
96   ];
98   makeWrapperArgs = [
99     # platformio is used in esphome/platformio_api.py
100     # esptool is used in esphome/__main__.py
101     # git is used in esphome/writer.py
102     # inetutils is used in esphome/dashboard/status/ping.py
103     "--prefix PATH : ${lib.makeBinPath [ platformio esptool git inetutils ]}"
104     "--prefix PYTHONPATH : ${python.pkgs.makePythonPath dependencies}" # will show better error messages
105     "--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ stdenv.cc.cc.lib ]}"
106     "--set ESPHOME_USE_SUBPROCESS ''"
107   ];
109   # Needed for tests
110   __darwinAllowLocalNetworking = true;
112   nativeCheckInputs = with python3Packages; [
113     hypothesis
114     mock
115     pytest-asyncio
116     pytest-cov-stub
117     pytest-mock
118     pytestCheckHook
119   ];
121   postCheck = ''
122     $out/bin/esphome --help > /dev/null
123   '';
125   postInstall =
126     let
127       argcomplete = lib.getExe' python3Packages.argcomplete "register-python-argcomplete";
128     in
129     ''
130       installShellCompletion --cmd esphome \
131         --bash <(${argcomplete} --shell bash esphome) \
132         --zsh <(${argcomplete} --shell zsh esphome) \
133         --fish <(${argcomplete} --shell fish esphome)
134     '';
136   passthru = {
137     dashboard = python.pkgs.esphome-dashboard;
138     updateScript = callPackage ./update.nix { };
139     tests = { inherit (nixosTests) esphome; };
140   };
142   meta = with lib; {
143     changelog = "https://github.com/esphome/esphome/releases/tag/${version}";
144     description = "Make creating custom firmwares for ESP32/ESP8266 super easy";
145     homepage = "https://esphome.io/";
146     license = with licenses; [
147       mit # The C++/runtime codebase of the ESPHome project (file extensions .c, .cpp, .h, .hpp, .tcc, .ino)
148       gpl3Only # The python codebase and all other parts of this codebase
149     ];
150     maintainers = with maintainers; [ globin hexa ];
151     mainProgram = "esphome";
152   };