{
  lib,
  buildPythonPackage,
  fetchPypi,
  pythonOlder,

  # runtime
  importlib-metadata,
  sqlalchemy,

  # optionals
  babel,
  arrow,
  pendulum,
  #, intervals
  phonenumbers,
  passlib,
  colour,
  python-dateutil,
  furl,
  cryptography,

  # tests
  pytestCheckHook,
  pygments,
  jinja2,
  docutils,
  flexmock,
  psycopg2,
  psycopg2cffi,
  pg8000,
  pytz,
  backports-zoneinfo,
  pymysql,
  pyodbc,

}:

buildPythonPackage rec {
  pname = "sqlalchemy-utils";
  version = "0.41.2";
  format = "setuptools";

  src = fetchPypi {
    inherit version;
    pname = "SQLAlchemy-Utils";
    hash = "sha256-vFmcjDszGeU85sXDxHESC9Ml0AcftvOKEOkk49B7mZA=";
  };

  patches = [ ./skip-database-tests.patch ];

  propagatedBuildInputs = [ sqlalchemy ] ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];

  passthru.optional-dependencies = {
    babel = [ babel ];
    arrow = [ arrow ];
    pendulum = [ pendulum ];
    #intervals = [ intervals ];
    phone = [ phonenumbers ];
    password = [ passlib ];
    color = [ colour ];
    timezone = [ python-dateutil ];
    url = [ furl ];
    encrypted = [ cryptography ];
  };

  nativeCheckInputs =
    [
      pytestCheckHook
      pygments
      jinja2
      docutils
      flexmock
      psycopg2
      pg8000
      pytz
      python-dateutil
      pymysql
      pyodbc
    ]
    ++ lib.flatten (builtins.attrValues passthru.optional-dependencies)
    ++ lib.optionals (pythonOlder "3.12") [
      # requires distutils, which were removed in 3.12
      psycopg2cffi
    ]
    ++ lib.optionals (pythonOlder "3.9") [ backports-zoneinfo ];

  pytestFlagsArray = [
    "--deselect tests/functions/test_database.py::TestDatabasePostgresCreateDatabaseCloseConnection::test_create_database_twice"
    "--deselect tests/functions/test_database.py::TestDatabasePostgresPg8000::test_create_and_drop"
    "--deselect tests/functions/test_database.py::TestDatabasePostgresPsycoPG2CFFI::test_create_and_drop"
    "--deselect tests/functions/test_database.py::TestDatabasePostgresPsycoPG3::test_create_and_drop"
  ];

  meta = with lib; {
    changelog = "https://github.com/kvesteri/sqlalchemy-utils/releases/tag/${version}";
    homepage = "https://github.com/kvesteri/sqlalchemy-utils";
    description = "Various utility functions and datatypes for SQLAlchemy";
    license = licenses.bsd3;
    maintainers = with maintainers; [ eadwu ];
  };
}
