{ lib
, buildPythonPackage
, fetchFromGitHub
, nose
, pylibmc
, memcached
, redis
, pymongo
, mock
, webtest
, sqlalchemy
, pycrypto
, cryptography
, isPy27
, isPy3k
, funcsigs
, pycryptopp
}:

buildPythonPackage rec {
  pname = "Beaker";
  version = "1.10.1";

  # The pypy release do not contains the tests
  src = fetchFromGitHub {
    owner = "bbangert";
    repo = "beaker";
    rev = version;
    sha256 = "0xrvg503xmi28w0hllr4s7fkap0p09fgw2wax3p1s2r6b3xjvbz7";
  };

  propagatedBuildInputs = [
    sqlalchemy
    pycrypto
    cryptography
  ] ++ lib.optionals (isPy27) [
    funcsigs
    pycryptopp
  ];

  checkInputs = [
    nose
    mock
    webtest
    pylibmc
    memcached
    redis
    pymongo
  ];


  # Can not run memcached tests because it immediately tries to connect
  postPatch = lib.optionalString isPy3k ''
    substituteInPlace setup.py \
      --replace "python-memcached" "python3-memcached"
    '' + ''

    rm tests/test_memcached.py
  '';

  # Disable external tests because they need to connect to a live database.
  # Also disable a test in test_cache.py called "test_upgrade" because
  # it currently fails on darwin.
  # Please see issue https://github.com/bbangert/beaker/issues/166
  checkPhase = ''
    nosetests \
      -e ".*test_ext_.*" \
      -e "test_upgrade" \
      -vv tests
  '';

  meta = {
    description = "A Session and Caching library with WSGI Middleware";
    maintainers = with lib.maintainers; [ domenkozar ];
  };
}