{ sources ? import ./nix/sources.nix , nixpkgs ? sources.nixpkgs , pkgs ? import nixpkgs {} }: with pkgs; let pythonEnv = (let python = let packageOverrides = self: super: { matplotlib = (super.matplotlib.override { enableTk = false; }).overridePythonAttrs(old: rec { version = "3.3.4"; src = super.fetchPypi { pname = "matplotlib"; inherit version; sha256 = "1c15g3rhnp4pn46akwzqqgrwvalhsy44zi3nd169x4i2djvpsiry"; }; # qhull library in nixpkgs in newer than expected by matplotlib 3.3.4 and has a different name postPatch = old.postPatch + '' substituteInPlace setupext.py --replace 'ext.libraries.append("qhull")' 'ext.libraries.append("qhull_r")' ''; }); flask = super.flask.overridePythonAttrs(old: rec { version = "1.1.2"; src = super.fetchPypi { pname = "Flask"; inherit version; sha256 = "0j6f4a9rpfh25k1gp7azqhnni4mb4fgy50jammgjgddw1l3w0w92"; }; preFixup = '' makeWrapperArgs+=(--set FLASK_NIX_HACK 1) ''; }); flask-cors = super.flask-cors.overridePythonAttrs(old: rec { version = "3.0.9"; src = super.fetchPypi { pname = "Flask-Cors"; inherit version; sha256 = "1v6gq4vjgyxi8q8lxawpdfhq01adb4bznnabp08ks5nzbwibz43y"; }; }); jinja2 = super.jinja2.overridePythonAttrs(old: rec { version = "2.11.3"; src = old.src.override { inherit version; sha256 = "1iiklf3wns67y5lfcacxma5vxfpb7h2a67xbghs01s0avqrq9md6"; }; }); # Workarounds for two Flask/Nix-related errors when FLASK_DEBUG = 1. # # Error #1: `flask run` prints the following: # # File "/nix/store/iygklcrqcyshaq57ybizia55x70cn1vq-python3.7-Flask-1.0.2/bin/flask", line 2 # export PATH='/nix/store/wpw6qdjbrv7s72kk81n1lwf3vj6fldk2-python3-3.7.8/bin:/nix/store/iygklcrqcyshaq57ybizia55x70cn1vq-python3.7-Flask-1.0.2/bin'${PATH:+':'}$PATH # SyntaxError: invalid syntax # # This can be fixed with updated version of # https://github.com/NixOS/nixpkgs/issues/42924#issuecomment-409101368 # (need to prepend src/ in substituteInPlace) # # Error #2: After #1 is fixed, Flask complains about missing # flask_cors. To solve this, we hardcode path to Flask wrapper # script and use it if FLACK_NIX_HACK is set. People try to # solve it properly at # https://github.com/NixOS/nixpkgs/issues/72345#issuecomment-622244484 werkzeug = super.werkzeug.overrideAttrs (old: rec { postPatch = '' substituteInPlace src/werkzeug/_reloader.py \ --replace "rv = [sys.executable]" \ 'if "FLASK_NIX_HACK" in os.environ: sys.argv[0] = os.path.join(os.path.dirname(sys.executable), "flask") return sys.argv' ''; }); }; in pkgs.python39.override {inherit packageOverrides; self = python;}; in python.withPackages(ps: with ps; [ flake8 # For syntax checking while editing .py files flask flask-cors matplotlib requests ])); in mkShell { buildInputs = [ libev openssl pythonEnv zlib pkg-config ]; FLASK_DEBUG = 1; # Setting FLASK_APP this way work in nix-shell but not in lorri. Se # we override the value in .envrc. shellHook = '' export FLASK_APP="$PWD/coffee-flask/app.py" ''; }