{ python3Packages, python3, fetchFromGitHub, fetchurl }: let Flask-Gravatar = python3Packages.buildPythonPackage { name = "Flask-Gravatar"; src = python3Packages.fetchPypi { pname = "Flask-Gravatar"; version = "0.5.0"; sha256 = "1qb2ylirjajdqsmldhwfdhf8i86k7vlh3y4gnqfqj4n6q8qmyrk0"; }; propagatedBuildInputs = with python3Packages; [ pytestrunner flask ]; checkInputs = with python3Packages; [ check-manifest coverage isort pydocstyle pytestcache pytestcov pytestpep8 pytest pygments ]; }; utopia = python3Packages.buildPythonPackage { name = "utopia"; src = fetchFromGitHub { owner = "notifico"; repo = "utopia"; rev = "70293ed5e1ca55232e0fae71061e7e9b9b29be6f"; sha256 = "11cnh9l4d9jlhafnfis9si6kgk9zsdd5439qnhxh6dca3x4a986q"; }; propagatedBuildInputs = with python3Packages; [ gevent blinker ]; doCheck = false; }; Flask-WTF = python3Packages.flask_wtf.overrideAttrs(oa: rec { version = "0.8.4"; src = python3Packages.fetchPypi { pname = "Flask-WTF"; inherit version; sha256 = "1khbwmlrcnk9f46f7kf531n06pkyfs6nc8fk273js9mj2igngg2y"; }; patchPhase = '' 2to3 . -w substituteInPlace flask_wtf/form.py --replace "self.SECRET_KEY = secret_key" "self.SECRET_KEY = bytes(secret_key, 'utf-8')" ''; }); Flask-XML-RPC = python3Packages.buildPythonPackage rec { pname = "Flask-XML-RPC"; version = "0.1.2"; src = python3Packages.fetchPypi { inherit pname version; sha256 = "1dwalj7pc5iid9l1k50q5mllirnn9f5s7jq54a66x48a4j179p2a"; }; propagatedBuildInputs = with python3Packages; [ flask wtforms nose ]; patchPhase = "2to3 . -w"; }; in python3Packages.buildPythonApplication { name = "notifico"; src = fetchFromGitHub { owner = "notifico"; repo = "notifico"; rev = "6af849e4c75dff4d740051676f5a2093a44efcee"; sha256 = "18jifqdvjy4x5s1bh7vx501pin52g4n3hhw1z4m2c0h512z4spdr"; }; patches = [ (fetchurl { url = https://github.com/whitequark/notifico/commit/22b582fad6cb97af6f7437e8462d720ddacc42ef.patch; sha256 = "0w8i8hf1r8b0p1y1zn9vyvnyi20qp120aiyalqymhsxsh17mma52"; }) ]; postPatch = '' 2to3 . -w substituteInPlace notifico/models/user.py --replace \ "return base64.b64encode(os.urandom(8))[:8]" \ "return base64.b64encode(os.urandom(8))[:8].decode()" substituteInPlace notifico/models/user.py --replace \ "hashlib.sha256(salt + password.strip()).hexdigest()" \ "hashlib.sha256((salt + password.strip()).encode()).hexdigest()" ''; propagatedBuildInputs = with python3Packages; [ flask Flask-WTF Flask-Gravatar flask_sqlalchemy Flask-XML-RPC flask_mail flask-caching Fabric sqlalchemy utopia gevent oauth2 redis gunicorn requests PyGithub xmltodict unidecode raven blinker docopt celery ]; postInstall = '' mkdir $out/bin cat << EOF > $out/bin/notifico #!${python3}/bin/python import sys from notifico.__main__ import main sys.exit(main(sys.argv)) EOF chmod +x $out/bin/notifico ''; doCheck = false; # tries to use network }