From 7066dc85baa1cd1e6d4d8bf81a46c2fa8e4825fc Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk Date: Sat, 14 Mar 2020 11:02:07 +0100 Subject: octoprint-plugins: use same python as octoprint, use overlays - ensure the plugins use the same python as octoprint - overlay of overriding plugins - drop octoprint-plugins attribute --- nixos/modules/services/misc/octoprint.nix | 9 +- pkgs/applications/misc/octoprint/default.nix | 115 ++++--- pkgs/applications/misc/octoprint/plugins.nix | 490 +++++++++++++-------------- pkgs/top-level/all-packages.nix | 2 +- 4 files changed, 311 insertions(+), 305 deletions(-) diff --git a/nixos/modules/services/misc/octoprint.nix b/nixos/modules/services/misc/octoprint.nix index 651ed374388..7a71d2c8c6a 100644 --- a/nixos/modules/services/misc/octoprint.nix +++ b/nixos/modules/services/misc/octoprint.nix @@ -17,9 +17,9 @@ let cfgUpdate = pkgs.writeText "octoprint-config.yaml" (builtins.toJSON fullConfig); - pluginsEnv = pkgs.python.buildEnv.override { - extraLibs = cfg.plugins pkgs.octoprint-plugins; - }; + pluginsEnv = package.python.withPackages (ps: [ps.octoprint] ++ (cfg.plugins ps)); + + package = pkgs.octoprint; in { @@ -106,7 +106,6 @@ in wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; path = [ pluginsEnv ]; - environment.PYTHONPATH = makeSearchPathOutput "lib" pkgs.python.sitePackages [ pluginsEnv ]; preStart = '' if [ -e "${cfg.stateDir}/config.yaml" ]; then @@ -119,7 +118,7 @@ in ''; serviceConfig = { - ExecStart = "${pkgs.octoprint}/bin/octoprint serve -b ${cfg.stateDir}"; + ExecStart = "${pluginsEnv}/bin/octoprint serve -b ${cfg.stateDir}"; User = cfg.user; Group = cfg.group; }; diff --git a/pkgs/applications/misc/octoprint/default.nix b/pkgs/applications/misc/octoprint/default.nix index 9d7874e9010..0f03cd7fae2 100644 --- a/pkgs/applications/misc/octoprint/default.nix +++ b/pkgs/applications/misc/octoprint/default.nix @@ -1,4 +1,7 @@ -{ stdenv, lib, fetchFromGitHub, python3 }: +{ pkgs, stdenv, lib, fetchFromGitHub, python3 +# To include additional plugins, pass them here as an overlay. +, packageOverrides ? self: super: {} +}: let mkOverride = attrname: version: sha256: self: super: { @@ -11,6 +14,7 @@ let }; py = python3.override { + self = py; packageOverrides = lib.foldr lib.composeExtensions (self: super: { }) ([ (mkOverride "flask" "0.12.5" "fac2b9d443e49f7e7358a444a3db5950bdd0324674d92ba67f8f1f15f876b14f") (mkOverride "tornado" "4.5.3" "02jzd23l4r6fswmwxaica9ldlyc2p6q8dk6dyff7j58fmdzf853d") @@ -19,8 +23,8 @@ let # Octoprint holds back jinja2 to 2.8.1 due to breaking changes. # This old version does not have updated test config for pytest 4, # and pypi tarball doesn't contain tests dir anyways. - (pself: psuper: { - jinja2 = psuper.jinja2.overridePythonAttrs (oldAttrs: rec { + (self: super: { + jinja2 = super.jinja2.overridePythonAttrs (oldAttrs: rec { version = "2.8.1"; src = oldAttrs.src.override { inherit version; @@ -29,69 +33,72 @@ let doCheck = false; }); - httpretty = psuper.httpretty.overridePythonAttrs (oldAttrs: rec { + httpretty = super.httpretty.overridePythonAttrs (oldAttrs: rec { doCheck = false; }); - celery = psuper.celery.overridePythonAttrs (oldAttrs: rec { + celery = super.celery.overridePythonAttrs (oldAttrs: rec { doCheck = false; }); }) - ]); - }; - - ignoreVersionConstraints = [ - "sentry-sdk" - ]; + (self: super: { + octoprint = self.buildPythonPackage rec { + pname = "OctoPrint"; + version = "1.4.0"; -in -py.pkgs.buildPythonApplication rec { - pname = "OctoPrint"; - version = "1.4.0"; - - src = fetchFromGitHub { - owner = "foosel"; - repo = "OctoPrint"; - rev = version; - sha256 = "1zla1ayr62lkvkr828dh3y287rzj3rv1hpij9kws44ynn4i582ga"; - }; + src = fetchFromGitHub { + owner = "foosel"; + repo = "OctoPrint"; + rev = version; + sha256 = "1zla1ayr62lkvkr828dh3y287rzj3rv1hpij9kws44ynn4i582ga"; + }; - propagatedBuildInputs = with py.pkgs; [ - awesome-slugify flask flask_assets rsa requests pkginfo watchdog - semantic-version werkzeug flaskbabel tornado - psutil pyserial flask_login netaddr markdown - pylru pyyaml sarge feedparser netifaces click websocket_client - scandir chainmap future wrapt monotonic emoji jinja2 - frozendict cachelib sentry-sdk filetype markupsafe - ] ++ lib.optionals stdenv.isDarwin [ py.pkgs.appdirs ]; + propagatedBuildInputs = with super; [ + awesome-slugify flask flask_assets rsa requests pkginfo watchdog + semantic-version werkzeug flaskbabel tornado + psutil pyserial flask_login netaddr markdown + pylru pyyaml sarge feedparser netifaces click websocket_client + scandir chainmap future wrapt monotonic emoji jinja2 + frozendict cachelib sentry-sdk filetype markupsafe + ] ++ lib.optionals stdenv.isDarwin [ py.pkgs.appdirs ]; - checkInputs = with py.pkgs; [ pytestCheckHook mock ddt ]; + checkInputs = with super; [ pytestCheckHook mock ddt ]; - postPatch = '' - sed -r -i \ - ${lib.concatStringsSep "\n" (map (e: - ''-e 's@${e}[<>=]+.*@${e}",@g' \'' - ) ignoreVersionConstraints)} - setup.py - ''; + postPatch = let + ignoreVersionConstraints = [ + "sentry-sdk" + ]; + in '' + sed -r -i \ + ${lib.concatStringsSep "\n" (map (e: + ''-e 's@${e}[<>=]+.*@${e}",@g' \'' + ) ignoreVersionConstraints)} + setup.py + ''; - dontUseSetuptoolsCheck = true; + dontUseSetuptoolsCheck = true; - preCheck = '' - export HOME=$(mktemp -d) - rm pytest.ini - ''; + preCheck = '' + export HOME=$(mktemp -d) + rm pytest.ini + ''; - disabledTests = [ - "test_check_setup" # Why should it be able to call pip? - ] ++ lib.optionals stdenv.isDarwin [ - "test_set_external_modification" - ]; + disabledTests = [ + "test_check_setup" # Why should it be able to call pip? + ] ++ lib.optionals stdenv.isDarwin [ + "test_set_external_modification" + ]; - meta = with stdenv.lib; { - homepage = https://octoprint.org/; - description = "The snappy web interface for your 3D printer"; - license = licenses.agpl3; - maintainers = with maintainers; [ abbradar gebner WhittlesJr ]; + meta = with stdenv.lib; { + homepage = https://octoprint.org/; + description = "The snappy web interface for your 3D printer"; + license = licenses.agpl3; + maintainers = with maintainers; [ abbradar gebner WhittlesJr ]; + }; + }; + }) + (import ./plugins.nix {inherit pkgs;}) + packageOverrides + ]); }; -} +in with py.pkgs; toPythonApplication octoprint diff --git a/pkgs/applications/misc/octoprint/plugins.nix b/pkgs/applications/misc/octoprint/plugins.nix index 10c4f2f8448..2b7c928a474 100644 --- a/pkgs/applications/misc/octoprint/plugins.nix +++ b/pkgs/applications/misc/octoprint/plugins.nix @@ -1,255 +1,255 @@ -{ stdenv, fetchgit, fetchFromGitHub, octoprint, python2Packages, marlin-calc }: +{ pkgs }: -let - buildPlugin = args: python2Packages.buildPythonPackage (args // { +with pkgs; + +self: super: let + buildPlugin = args: self.buildPythonPackage (args // { pname = "OctoPrintPlugin-${args.pname}"; inherit (args) version; - propagatedBuildInputs = (args.propagatedBuildInputs or []) ++ [ octoprint ]; + propagatedBuildInputs = (args.propagatedBuildInputs or []) ++ [ super.octoprint ]; # none of the following have tests doCheck = false; }); +in { + inherit buildPlugin; + + # Deprecated alias + m3d-fio = self.m33-fio; # added 2016-08-13 + + m33-fio = buildPlugin rec { + pname = "M33-Fio"; + version = "1.21"; + + src = fetchFromGitHub { + owner = "donovan6000"; + repo = "M33-Fio"; + rev = "V${version}"; + sha256 = "1la3611kkqn8yiwjn6cizc45ri8pnk6ckld1na4nk6mqk88jvjq7"; + }; + + patches = [ + ./m33-fio-one-library.patch + ]; + + postPatch = '' + rm -rf octoprint_m33fio/static/libraries/* + ( + cd 'shared library source' + make + ) + ''; + + meta = with stdenv.lib; { + description = "OctoPrint plugin for the Micro 3D printer"; + homepage = https://github.com/donovan6000/M33-Fio; + license = licenses.gpl3; + maintainers = with maintainers; [ abbradar ]; + }; + }; + + mqtt = buildPlugin rec { + pname = "MQTT"; + version = "0.8.6"; + + src = fetchFromGitHub { + owner = "OctoPrint"; + repo = "OctoPrint-MQTT"; + rev = version; + sha256 = "0y1jnfplcy8mh3szrfbbvngl02j49cbdizglrfsry4fvqg50zjxd"; + }; + + propagatedBuildInputs = with super; [ paho-mqtt ]; + + meta = with stdenv.lib; { + description = "Publish printer status MQTT"; + homepage = https://github.com/OctoPrint/OctoPrint-MQTT; + license = licenses.agpl3; + maintainers = with maintainers; [ peterhoeg ]; + }; + }; + + titlestatus = buildPlugin rec { + pname = "TitleStatus"; + version = "0.0.4"; + + src = fetchFromGitHub { + owner = "MoonshineSG"; + repo = "OctoPrint-TitleStatus"; + rev = version; + sha256 = "1l78xrabn5hcly2mgxwi17nwgnp2s6jxi9iy4wnw8k8icv74ag7k"; + }; + + meta = with stdenv.lib; { + description = "Show printers status in window title"; + homepage = https://github.com/MoonshineSG/OctoPrint-TitleStatus; + license = licenses.agpl3; + maintainers = with maintainers; [ abbradar ]; + }; + }; + + stlviewer = buildPlugin rec { + pname = "STLViewer"; + version = "0.4.2"; + + src = fetchFromGitHub { + owner = "jneilliii"; + repo = "OctoPrint-STLViewer"; + rev = version; + sha256 = "0mkvh44fn2ch4z2avsdjwi1rp353ylmk9j5fln4x7rx8ph8y7g2b"; + }; + + meta = with stdenv.lib; { + description = "A simple stl viewer tab for OctoPrint"; + homepage = https://github.com/jneilliii/Octoprint-STLViewer; + license = licenses.agpl3; + maintainers = with maintainers; [ abbradar ]; + }; + }; + + curaenginelegacy = buildPlugin rec { + pname = "CuraEngineLegacy"; + version = "1.0.2"; + + src = fetchFromGitHub { + owner = "OctoPrint"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "1cdb276wfyf3wcfj5g3migd6b6aqmkrxncrqjfcfx4j4k3xac965"; + }; + + meta = with stdenv.lib; { + description = "Plugin for slicing via Cura Legacy from within OctoPrint"; + homepage = "https://github.com/OctoPrint/OctoPrint-CuraEngineLegacy"; + license = licenses.agpl3; + maintainers = with maintainers; [ gebner ]; + }; + }; - self = { - - # Deprecated alias - m3d-fio = self.m33-fio; # added 2016-08-13 - - m33-fio = buildPlugin rec { - pname = "M33-Fio"; - version = "1.21"; - - src = fetchFromGitHub { - owner = "donovan6000"; - repo = "M33-Fio"; - rev = "V${version}"; - sha256 = "1la3611kkqn8yiwjn6cizc45ri8pnk6ckld1na4nk6mqk88jvjq7"; - }; - - patches = [ - ./m33-fio-one-library.patch - ]; - - postPatch = '' - rm -rf octoprint_m33fio/static/libraries/* - ( - cd 'shared library source' - make - ) - ''; - - meta = with stdenv.lib; { - description = "OctoPrint plugin for the Micro 3D printer"; - homepage = https://github.com/donovan6000/M33-Fio; - license = licenses.gpl3; - maintainers = with maintainers; [ abbradar ]; - }; - }; - - mqtt = buildPlugin rec { - pname = "MQTT"; - version = "0.8.6"; - - src = fetchFromGitHub { - owner = "OctoPrint"; - repo = "OctoPrint-MQTT"; - rev = version; - sha256 = "0y1jnfplcy8mh3szrfbbvngl02j49cbdizglrfsry4fvqg50zjxd"; - }; - - propagatedBuildInputs = with python2Packages; [ paho-mqtt ]; - - meta = with stdenv.lib; { - description = "Publish printer status MQTT"; - homepage = https://github.com/OctoPrint/OctoPrint-MQTT; - license = licenses.agpl3; - maintainers = with maintainers; [ peterhoeg ]; - }; - }; - - titlestatus = buildPlugin rec { - pname = "TitleStatus"; - version = "0.0.4"; - - src = fetchFromGitHub { - owner = "MoonshineSG"; - repo = "OctoPrint-TitleStatus"; - rev = version; - sha256 = "1l78xrabn5hcly2mgxwi17nwgnp2s6jxi9iy4wnw8k8icv74ag7k"; - }; - - meta = with stdenv.lib; { - description = "Show printers status in window title"; - homepage = https://github.com/MoonshineSG/OctoPrint-TitleStatus; - license = licenses.agpl3; - maintainers = with maintainers; [ abbradar ]; - }; - }; - - stlviewer = buildPlugin rec { - pname = "STLViewer"; - version = "0.4.2"; - - src = fetchFromGitHub { - owner = "jneilliii"; - repo = "OctoPrint-STLViewer"; - rev = version; - sha256 = "0mkvh44fn2ch4z2avsdjwi1rp353ylmk9j5fln4x7rx8ph8y7g2b"; - }; - - meta = with stdenv.lib; { - description = "A simple stl viewer tab for OctoPrint"; - homepage = https://github.com/jneilliii/Octoprint-STLViewer; - license = licenses.agpl3; - maintainers = with maintainers; [ abbradar ]; - }; - }; - - curaenginelegacy = buildPlugin rec { - pname = "CuraEngineLegacy"; - version = "1.0.2"; - - src = fetchFromGitHub { - owner = "OctoPrint"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "1cdb276wfyf3wcfj5g3migd6b6aqmkrxncrqjfcfx4j4k3xac965"; - }; - - meta = with stdenv.lib; { - description = "Plugin for slicing via Cura Legacy from within OctoPrint"; - homepage = "https://github.com/OctoPrint/OctoPrint-CuraEngineLegacy"; - license = licenses.agpl3; - maintainers = with maintainers; [ gebner ]; - }; - }; - - touchui = buildPlugin rec { - pname = "TouchUI"; - version = "0.3.13"; - - src = fetchFromGitHub { - owner = "BillyBlaze"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "0qk12ysabdzy6cna3l4f8v3qcnppppwxxsjx2i0xn1nd0cv6yzwh"; - }; - - meta = with stdenv.lib; { - description = "Touch friendly interface for a small TFT module or phone for OctoPrint"; - homepage = "https://github.com/BillyBlaze/OctoPrint-TouchUI"; - license = licenses.agpl3; - maintainers = with maintainers; [ gebner ]; - }; - }; - - psucontrol = buildPlugin rec { - pname = "PSUControl"; - version = "0.1.8"; - - src = fetchFromGitHub { - owner = "kantlivelong"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "0aj38d7b7d5pzmzq841pip18cpg18wy2vrxq2nd13875597y54b8"; - }; - - preConfigure = '' - # optional; RPi.GPIO is broken on vanilla kernels - sed /RPi.GPIO/d -i requirements.txt - ''; - - meta = with stdenv.lib; { - description = "OctoPrint plugin to control ATX/AUX power supply"; - homepage = "https://github.com/kantlivelong/OctoPrint-PSUControl"; - license = licenses.agpl3; - maintainers = with maintainers; [ gebner ]; - }; - }; - - printtimegenius = buildPlugin rec { - pname = "PrintTimeGenius"; - version = "2.2.1"; - - src = fetchFromGitHub { - owner = "eyal0"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "1dr93vbpxgxw3b1q4rwam8f4dmiwr5vnfr9796g6jx8xkpfzzy1h"; - }; - - preConfigure = '' - # PrintTimeGenius ships with marlin-calc binaries for multiple architectures - rm */analyzers/marlin-calc* - sed 's@"{}.{}".format(binary_base_name, machine)@"${marlin-calc}/bin/marlin-calc"@' -i */analyzers/analyze_progress.py - ''; - - patches = [ - ./printtimegenius-logging.patch - ]; - - meta = with stdenv.lib; { - description = "Better print time estimation for OctoPrint"; - homepage = "https://github.com/eyal0/OctoPrint-PrintTimeGenius"; - license = licenses.agpl3; - maintainers = with maintainers; [ gebner ]; - }; - }; - - abl-expert = buildPlugin rec { - pname = "ABL_Expert"; - version = "2019-12-21"; - - src = fetchgit { - url = "https://framagit.org/razer/Octoprint_ABL_Expert/"; - rev = "f11fbe05088ad618bfd9d064ac3881faec223f33"; - sha256 = "026r4prkyvwzxag5pv36455q7s3gaig37nmr2nbvhwq3d2lbi5s4"; - }; - - meta = with stdenv.lib; { - description = "Marlin auto bed leveling control, mesh correction, and z probe handling"; - homepage = "https://framagit.org/razer/Octoprint_ABL_Expert/"; - license = licenses.agpl3; - maintainers = with maintainers; [ WhittlesJr ]; - }; - }; - - gcodeeditor = buildPlugin rec { - pname = "GcodeEditor"; - version = "0.2.6"; - - src = fetchFromGitHub { - owner = "ieatacid"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "0c6p78r3vd6ys3kld308pyln09zjbr9yif1ljvcx6wlml2i5l1vh"; - }; - - meta = with stdenv.lib; { - description = "Edit gcode on OctoPrint"; - homepage = "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop"; - license = licenses.agpl3; - maintainers = with maintainers; [ WhittlesJr ]; - }; - }; - - simpleemergencystop = buildPlugin rec { - pname = "SimpleEmergencyStop"; - version = "0.2.5"; - - src = fetchFromGitHub { - owner = "Sebclem"; - repo = "OctoPrint-${pname}"; - rev = version; - sha256 = "10wadv09wv2h96igvq3byw9hz1si82n3c7v5y0ii3j7hm2d06y8p"; - }; - - meta = with stdenv.lib; { - description = "A simple plugin that add an emergency stop buton on NavBar of OctoPrint"; - homepage = "https://github.com/ieatacid/OctoPrint-GcodeEditor"; - license = licenses.agpl3; - maintainers = with maintainers; [ WhittlesJr ]; - }; + touchui = buildPlugin rec { + pname = "TouchUI"; + version = "0.3.13"; + + src = fetchFromGitHub { + owner = "BillyBlaze"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "0qk12ysabdzy6cna3l4f8v3qcnppppwxxsjx2i0xn1nd0cv6yzwh"; + }; + + meta = with stdenv.lib; { + description = "Touch friendly interface for a small TFT module or phone for OctoPrint"; + homepage = "https://github.com/BillyBlaze/OctoPrint-TouchUI"; + license = licenses.agpl3; + maintainers = with maintainers; [ gebner ]; }; }; -in self + psucontrol = buildPlugin rec { + pname = "PSUControl"; + version = "0.1.8"; + + src = fetchFromGitHub { + owner = "kantlivelong"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "0aj38d7b7d5pzmzq841pip18cpg18wy2vrxq2nd13875597y54b8"; + }; + + preConfigure = '' + # optional; RPi.GPIO is broken on vanilla kernels + sed /RPi.GPIO/d -i requirements.txt + ''; + + meta = with stdenv.lib; { + description = "OctoPrint plugin to control ATX/AUX power supply"; + homepage = "https://github.com/kantlivelong/OctoPrint-PSUControl"; + license = licenses.agpl3; + maintainers = with maintainers; [ gebner ]; + }; + }; + + printtimegenius = buildPlugin rec { + pname = "PrintTimeGenius"; + version = "2.2.1"; + + src = fetchFromGitHub { + owner = "eyal0"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "1dr93vbpxgxw3b1q4rwam8f4dmiwr5vnfr9796g6jx8xkpfzzy1h"; + }; + + preConfigure = '' + # PrintTimeGenius ships with marlin-calc binaries for multiple architectures + rm */analyzers/marlin-calc* + sed 's@"{}.{}".format(binary_base_name, machine)@"${pkgs.marlin-calc}/bin/marlin-calc"@' -i */analyzers/analyze_progress.py + ''; + + patches = [ + ./printtimegenius-logging.patch + ]; + + meta = with stdenv.lib; { + description = "Better print time estimation for OctoPrint"; + homepage = "https://github.com/eyal0/OctoPrint-PrintTimeGenius"; + license = licenses.agpl3; + maintainers = with maintainers; [ gebner ]; + }; + }; + + abl-expert = buildPlugin rec { + pname = "ABL_Expert"; + version = "2019-12-21"; + + src = fetchgit { + url = "https://framagit.org/razer/Octoprint_ABL_Expert/"; + rev = "f11fbe05088ad618bfd9d064ac3881faec223f33"; + sha256 = "026r4prkyvwzxag5pv36455q7s3gaig37nmr2nbvhwq3d2lbi5s4"; + }; + + meta = with stdenv.lib; { + description = "Marlin auto bed leveling control, mesh correction, and z probe handling"; + homepage = "https://framagit.org/razer/Octoprint_ABL_Expert/"; + license = licenses.agpl3; + maintainers = with maintainers; [ WhittlesJr ]; + }; + }; + + gcodeeditor = buildPlugin rec { + pname = "GcodeEditor"; + version = "0.2.6"; + + src = fetchFromGitHub { + owner = "ieatacid"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "0c6p78r3vd6ys3kld308pyln09zjbr9yif1ljvcx6wlml2i5l1vh"; + }; + + meta = with stdenv.lib; { + description = "Edit gcode on OctoPrint"; + homepage = "https://github.com/Sebclem/OctoPrint-SimpleEmergencyStop"; + license = licenses.agpl3; + maintainers = with maintainers; [ WhittlesJr ]; + }; + }; + + simpleemergencystop = buildPlugin rec { + pname = "SimpleEmergencyStop"; + version = "0.2.5"; + + src = fetchFromGitHub { + owner = "Sebclem"; + repo = "OctoPrint-${pname}"; + rev = version; + sha256 = "10wadv09wv2h96igvq3byw9hz1si82n3c7v5y0ii3j7hm2d06y8p"; + }; + + meta = with stdenv.lib; { + description = "A simple plugin that add an emergency stop buton on NavBar of OctoPrint"; + homepage = "https://github.com/ieatacid/OctoPrint-GcodeEditor"; + license = licenses.agpl3; + maintainers = with maintainers; [ WhittlesJr ]; + }; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index e2bc8a135eb..305148b4350 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -20900,7 +20900,7 @@ in octoprint = callPackage ../applications/misc/octoprint { }; - octoprint-plugins = callPackage ../applications/misc/octoprint/plugins.nix { }; + octoprint-plugins = throw ''octoprint-plugins are now part of the octoprint package set.''; ocrad = callPackage ../applications/graphics/ocrad { }; -- cgit 1.4.1