with import <nixpkgs> {}; let
  pyscrypt = python37.pkgs.buildPythonPackage rec {
    pname = "pyscrypt";
    version = "1.6.2";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "bafdd195f10f7c7395f0133bad09746a68e0e6b66da202c9bdb6b1eb4abba5e9";
    };
    doCheck = false;
    meta = with stdenv.lib; {
      homepage = "https://github.com/ricmoo/pyscrypt";
      license = licenses.mit;
      description = "Pure-Python Implementation of the scrypt password-based key derivation function and scrypt file format library";
    };
  };

  orderedmultidict = python37.pkgs.buildPythonPackage rec {
    pname = "orderedmultidict";
    version = "1.0";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "b89895ba6438038d0bdf88020ceff876cf3eae0d5c66a69b526fab31125db2c5";
    };
    checkInputs = [python37Packages.pycodestyle];
    propagatedBuildInputs = [python37Packages.six];
    meta = with pkgs.stdenv.lib; {
      homepage = "https://github.com/gruns/orderedmultidict";
      license = licenses.unlicense;
      description = "Ordered Multivalue Dictionary - omdict.";
    };
  };

  furl = python37.pkgs.buildPythonPackage rec {
    pname = "furl";
    version = "2.0.0";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "fdcaedc1fb19a63d7d875b0105b0a5b496dd0989330d454a42bcb401fa5454ec";
    };
    checkInputs = [python37Packages.flake8];
    propagatedBuildInputs = [orderedmultidict python37Packages.six];
    meta = with pkgs.stdenv.lib; {
      homepage = "https://github.com/gruns/furl";
      license = licenses.publicDomain;
      description = "URL manipulation made simple.";
    };
  };

  etesync = python37.pkgs.buildPythonPackage rec {
    pname = "etesync";
    version = "0.8.1";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "007zsdn0zv0f80wpyf8fzl446wmv7jr8a0pdp4wj1y61b14f4q0p";
    };
    checkInputs = [python37Packages.pytest];
    meta = with pkgs.stdenv.lib; {
      homepage = "https://github.com/etesync/pyetesync";
      license = licenses.lgpl3;
      description = "Python client library for EteSync";
    };
    propagatedBuildInputs = [
      python37Packages.appdirs
      python37Packages.asn1crypto
      python37Packages.certifi
      python37Packages.cffi
      python37Packages.chardet
      python37Packages.coverage
      python37Packages.cryptography
      python37Packages.idna
      python37Packages.packaging
      python37Packages.peewee
      python37Packages.py
      python37Packages.pyasn1
      python37Packages.pycparser
      python37Packages.pyparsing
      python37Packages.python-dateutil
      python37Packages.requests
      python37Packages.six
      python37Packages.urllib3
      python37Packages.vobject
      pyscrypt
      orderedmultidict
      furl
    ];
  };

  radicale = python37.pkgs.buildPythonPackage rec {
    pname = "Radicale";
    version = "2.1.11";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "02273fcc6ae10e0f74aa12652e24d0001eec8dbf467d54ddb4dfcc2af7d7a5db";
    };
    doCheck = false;
    checkInputs = [
      python37Packages.pytestrunner
      python37Packages.pytest-isort
      python37Packages.pytest-flake8
      python37Packages.pytestcov
    ];
    propagatedBuildInputs = [python37Packages.dateutil python37Packages.vobject];
    meta = with pkgs.stdenv.lib; {
      homepage = "http://www.radicale.org/";
      license = licenses.gpl1;
      description = "CalDAV and CardDAV Server";
    };
  };

  radicale-storage-etesync = python37.pkgs.buildPythonPackage rec {
    pname = "radicale_storage_etesync";
    version = "0.7.0";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "1vq889jshlb3m13m2lgbjy440lph27ig53sfipkj7ds5sb5znhh5";
    };
    propagatedBuildInputs = [
      etesync
      radicale
      pyscrypt
      orderedmultidict
      furl
      python37Packages.coverage
      python37Packages.pyasn1
      python37Packages.appdirs
      python37Packages.vobject
      python37Packages.py
      python37Packages.cffi
      python37Packages.pyparsing
      python37Packages.requests
      python37Packages.peewee
    ];
    meta = with pkgs.stdenv.lib; {
      homepage = "https://github.com/etesync/radicale_storage_etesync";
      license = licenses.gpl3;
      description = "An EteSync storage plugin for radicale";
    };
  };
in
  python37.pkgs.buildPythonPackage rec {
    pname = "etesync-dav";
    version = "0.5.0";
    src = pythonPackages.fetchPypi {
      inherit pname version;
      sha256 = "18ykgi3gqy6p7wj7n9d88rsn0y566ypl5ixpb3v7l3f6w5fffwh1";
    };
    propagatedBuildInputs = [
      python37Packages.pytz
      python37Packages.pytzdata
      python37Packages.appdirs
      python37Packages.asn1crypto
      python37Packages.certifi
      python37Packages.cffi
      python37Packages.chardet
      python37Packages.coverage
      python37Packages.cryptography
      python37Packages.idna
      python37Packages.packaging
      python37Packages.peewee
      python37Packages.py
      python37Packages.pyasn1
      python37Packages.pycparser
      python37Packages.pyparsing
      python37Packages.python-dateutil
      python37Packages.requests
      python37Packages.six
      python37Packages.urllib3
      python37Packages.vobject
      radicale
      furl
      orderedmultidict
      pyscrypt
      etesync
      radicale-storage-etesync
    ];
  }
