diff --git a/pkgs/development/python-modules/limits/default.nix b/pkgs/development/python-modules/limits/default.nix index cc4dbd03f3f8..999c73d851e7 100644 --- a/pkgs/development/python-modules/limits/default.nix +++ b/pkgs/development/python-modules/limits/default.nix @@ -1,12 +1,12 @@ { lib, - aetcd, buildPythonPackage, coredis, deprecated, - etcd3, fetchFromGitHub, flaky, + hatchling, + hatch-vcs, hiro, importlib-resources, motor, @@ -18,47 +18,35 @@ pytest-cov-stub, pytest-lazy-fixtures, pytestCheckHook, - pythonOlder, redis, - setuptools, typing-extensions, valkey, }: buildPythonPackage rec { pname = "limits"; - version = "5.4.0"; + version = "5.6.0"; pyproject = true; src = fetchFromGitHub { owner = "alisaifee"; repo = "limits"; tag = version; - # Upstream uses versioneer, which relies on git attributes substitution. - # This leads to non-reproducible archives on github. Remove the substituted - # file here, and recreate it later based on our version info. - hash = "sha256-EHLqkd5Muazr52/oYaLklFVvF+AzJWGbFaaIG+T0ulE="; + hash = "sha256-JmxoFc+AWV4qLgexpAysMGRKx2Q6K6AqNoaGkWU28Ro="; postFetch = '' - rm "$out/limits/_version.py" + rm "$out/limits/_version.pyi" ''; }; - patches = [ - ./only-test-in-memory.patch - ]; - postPatch = '' substituteInPlace pytest.ini \ --replace-fail "-K" "" - - substituteInPlace setup.py \ - --replace-fail "versioneer.get_version()" "'${version}'" - - # Recreate _version.py, deleted at fetch time due to non-reproducibility. - echo 'def get_versions(): return {"version": "${version}"}' > limits/_version.py ''; - build-system = [ setuptools ]; + build-system = [ + hatchling + hatch-vcs + ]; dependencies = [ deprecated @@ -68,17 +56,14 @@ buildPythonPackage rec { ]; optional-dependencies = { - redis = [ redis ]; - rediscluster = [ redis ]; + async-memcached = [ pymemcache ]; + async-mongodb = [ motor ]; + async-redis = [ coredis ]; + async-valkey = [ valkey ]; memcached = [ pymemcache ]; mongodb = [ pymongo ]; - etcd = [ etcd3 ]; - async-redis = [ coredis ]; - # async-memcached = [ - # emcache # Missing module - # ]; - async-mongodb = [ motor ]; - async-etcd = [ aetcd ]; + redis = [ redis ]; + rediscluster = [ redis ]; valkey = [ valkey ]; }; @@ -102,9 +87,17 @@ buildPythonPackage rec { pytestFlags = [ "--benchmark-disable" ]; disabledTests = [ - "test_moving_window_memcached" - # Flaky: compares time to magic value - "test_sliding_window_counter_previous_window" + # requires docker + "TestAsyncConcurrency" + "TestAsyncFixedWindow" + "TestAsyncMovingWindow" + "TestAsyncSlidingWindow" + "TestConcreteStorages" + "TestConcurrency" + "TestFixedWindow" + "TestMovingWindow" + "TestRedisStorage" + "TestSlidingWindow" ]; pythonImportsCheck = [ "limits" ]; diff --git a/pkgs/development/python-modules/limits/only-test-in-memory.patch b/pkgs/development/python-modules/limits/only-test-in-memory.patch deleted file mode 100644 index a3a0c5697d78..000000000000 --- a/pkgs/development/python-modules/limits/only-test-in-memory.patch +++ /dev/null @@ -1,397 +0,0 @@ -diff --git a/tests/aio/test_storage.py b/tests/aio/test_storage.py -index 43fc5b1..9aa86ed 100644 ---- a/tests/aio/test_storage.py -+++ b/tests/aio/test_storage.py -@@ -153,94 +153,6 @@ class TestBaseStorage: - marks=pytest.mark.memory, - id="in-memory", - ), -- pytest.param( -- "async+redis://localhost:7379", -- {}, -- RedisStorage, -- lf("redis_basic"), -- marks=pytest.mark.redis, -- id="redis", -- ), -- pytest.param( -- "async+redis+unix:///tmp/limits.redis.sock", -- {}, -- RedisStorage, -- lf("redis_uds"), -- marks=pytest.mark.redis, -- id="redis-uds", -- ), -- pytest.param( -- "async+redis+unix://:password/tmp/limits.redis.sock", -- {}, -- RedisStorage, -- lf("redis_uds"), -- marks=pytest.mark.redis, -- id="redis-uds-auth", -- ), -- pytest.param( -- "async+memcached://localhost:22122", -- {}, -- MemcachedStorage, -- lf("memcached"), -- marks=pytest.mark.memcached, -- id="memcached", -- ), -- pytest.param( -- "async+memcached://localhost:22122,localhost:22123", -- {}, -- MemcachedStorage, -- lf("memcached_cluster"), -- marks=pytest.mark.memcached, -- id="memcached-cluster", -- ), -- pytest.param( -- "async+redis+sentinel://localhost:26379", -- {"service_name": "mymaster"}, -- RedisSentinelStorage, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel", -- ), -- pytest.param( -- "async+redis+sentinel://localhost:26379/mymaster", -- {}, -- RedisSentinelStorage, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel-service-name-url", -- ), -- pytest.param( -- "async+redis+sentinel://:sekret@localhost:36379/mymaster", -- {"password": "sekret"}, -- RedisSentinelStorage, -- lf("redis_sentinel_auth"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel-auth", -- ), -- pytest.param( -- "async+redis+cluster://localhost:7001/", -- {}, -- RedisClusterStorage, -- lf("redis_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster", -- ), -- pytest.param( -- "async+redis+cluster://:sekret@localhost:8400/", -- {}, -- RedisClusterStorage, -- lf("redis_auth_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster-auth", -- ), -- pytest.param( -- "async+mongodb://localhost:37017/", -- {}, -- MongoDBStorage, -- lf("mongodb"), -- marks=pytest.mark.mongodb, -- id="mongodb", -- ), - ], - ) - class TestConcreteStorages: -diff --git a/tests/test_storage.py b/tests/test_storage.py -index f9698c0..2062e3a 100644 ---- a/tests/test_storage.py -+++ b/tests/test_storage.py -@@ -148,102 +148,6 @@ class TestBaseStorage: - "uri, args, expected_instance, fixture", - [ - pytest.param("memory://", {}, MemoryStorage, None, id="in-memory"), -- pytest.param( -- "redis://localhost:7379", -- {}, -- RedisStorage, -- lf("redis_basic"), -- marks=pytest.mark.redis, -- id="redis", -- ), -- pytest.param( -- "redis+unix:///tmp/limits.redis.sock", -- {}, -- RedisStorage, -- lf("redis_uds"), -- marks=pytest.mark.redis, -- id="redis-uds", -- ), -- pytest.param( -- "redis+unix://:password/tmp/limits.redis.sock", -- {}, -- RedisStorage, -- lf("redis_uds"), -- marks=pytest.mark.redis, -- id="redis-uds-auth", -- ), -- pytest.param( -- "memcached://localhost:22122", -- {}, -- MemcachedStorage, -- lf("memcached"), -- marks=pytest.mark.memcached, -- id="memcached", -- ), -- pytest.param( -- "memcached://localhost:22122,localhost:22123", -- {}, -- MemcachedStorage, -- lf("memcached_cluster"), -- marks=pytest.mark.memcached, -- id="memcached-cluster", -- ), -- pytest.param( -- "memcached:///tmp/limits.memcached.sock", -- {}, -- MemcachedStorage, -- lf("memcached_uds"), -- marks=pytest.mark.memcached, -- id="memcached-uds", -- ), -- pytest.param( -- "redis+sentinel://localhost:26379", -- {"service_name": "mymaster"}, -- RedisSentinelStorage, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel", -- ), -- pytest.param( -- "redis+sentinel://localhost:26379/mymaster", -- {}, -- RedisSentinelStorage, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel-service-name-url", -- ), -- pytest.param( -- "redis+sentinel://:sekret@localhost:36379/mymaster", -- {"password": "sekret"}, -- RedisSentinelStorage, -- lf("redis_sentinel_auth"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel-auth", -- ), -- pytest.param( -- "redis+cluster://localhost:7001/", -- {}, -- RedisClusterStorage, -- lf("redis_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster", -- ), -- pytest.param( -- "redis+cluster://:sekret@localhost:8400/", -- {}, -- RedisClusterStorage, -- lf("redis_auth_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster-auth", -- ), -- pytest.param( -- "mongodb://localhost:37017/", -- {}, -- MongoDBStorage, -- lf("mongodb"), -- marks=pytest.mark.mongodb, -- id="mongodb", -- ), - ], - ) - class TestConcreteStorages: -diff --git a/tests/utils.py b/tests/utils.py -index 3341bcf..6dc2bc3 100644 ---- a/tests/utils.py -+++ b/tests/utils.py -@@ -90,186 +90,11 @@ ALL_STORAGES = { - "memory": pytest.param( - "memory://", {}, None, marks=pytest.mark.memory, id="in-memory" - ), -- "redis": pytest.param( -- "redis://localhost:7379", -- {}, -- lf("redis_basic"), -- marks=pytest.mark.redis, -- id="redis_basic", -- ), -- "memcached": pytest.param( -- "memcached://localhost:22122", -- {}, -- lf("memcached"), -- marks=[pytest.mark.memcached, pytest.mark.flaky], -- id="memcached", -- ), -- "memcached-cluster": pytest.param( -- "memcached://localhost:22122,localhost:22123", -- {}, -- lf("memcached_cluster"), -- marks=[pytest.mark.memcached, pytest.mark.flaky], -- id="memcached-cluster", -- ), -- "redis-cluster": pytest.param( -- "redis+cluster://localhost:7001/", -- {}, -- lf("redis_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster", -- ), -- "redis-cluster_auth": pytest.param( -- "redis+cluster://:sekret@localhost:8400/", -- {}, -- lf("redis_auth_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster-auth", -- ), -- "redis-ssl-cluster": pytest.param( -- "redis+cluster://localhost:8301", -- { -- "ssl": True, -- "ssl_cert_reqs": "required", -- "ssl_keyfile": "./tests/tls/client.key", -- "ssl_certfile": "./tests/tls/client.crt", -- "ssl_ca_certs": "./tests/tls/ca.crt", -- }, -- lf("redis_ssl_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-ssl-cluster", -- ), -- "redis-sentinel": pytest.param( -- "redis+sentinel://localhost:26379/mymaster", -- {"use_replicas": False}, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel", -- ), -- "mongodb": pytest.param( -- "mongodb://localhost:37017/", -- {}, -- lf("mongodb"), -- marks=pytest.mark.mongodb, -- id="mongodb", -- ), -- "valkey": pytest.param( -- "valkey://localhost:12379", -- {}, -- lf("valkey_basic"), -- marks=pytest.mark.valkey, -- id="valkey_basic", -- ), -- "valkey-cluster": pytest.param( -- "valkey+cluster://localhost:2001/", -- {}, -- lf("valkey_cluster"), -- marks=pytest.mark.valkey_cluster, -- id="valkey-cluster", -- ), - } - ALL_STORAGES_ASYNC = { - "memory": pytest.param( - "async+memory://", {}, None, marks=pytest.mark.memory, id="in-memory" - ), -- "redis": pytest.param( -- "async+redis://localhost:7379", -- { -- "implementation": ASYNC_REDIS_IMPLEMENTATION, -- }, -- lf("redis_basic"), -- marks=pytest.mark.redis, -- id="redis", -- ), -- "memcached": pytest.param( -- "async+memcached://localhost:22122", -- { -- "implementation": ASYNC_MEMCACHED_IMPLEMENTATION, -- }, -- lf("memcached"), -- marks=[pytest.mark.memcached, pytest.mark.flaky], -- id="memcached", -- ), -- "memcached-cluster": pytest.param( -- "async+memcached://localhost:22122,localhost:22123", -- { -- "implementation": ASYNC_MEMCACHED_IMPLEMENTATION, -- }, -- lf("memcached_cluster"), -- marks=[pytest.mark.memcached, pytest.mark.flaky], -- id="memcached-cluster", -- ), -- "memcached-sasl": pytest.param( -- "async+memcached://user:password@localhost:22124", -- { -- "implementation": ASYNC_MEMCACHED_IMPLEMENTATION, -- }, -- lf("memcached_sasl"), -- marks=[pytest.mark.memcached, pytest.mark.flaky], -- id="memcached-sasl", -- ), -- "redis-cluster": pytest.param( -- "async+redis+cluster://localhost:7001/", -- { -- "implementation": ASYNC_REDIS_IMPLEMENTATION, -- }, -- lf("redis_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster", -- ), -- "redis-cluster-auth": pytest.param( -- "async+redis+cluster://:sekret@localhost:8400/", -- { -- "implementation": ASYNC_REDIS_IMPLEMENTATION, -- }, -- lf("redis_auth_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-cluster-auth", -- ), -- "redis-ssl-cluster": pytest.param( -- "async+redis+cluster://localhost:8301", -- { -- "ssl": True, -- "ssl_cert_reqs": "required", -- "ssl_keyfile": "./tests/tls/client.key", -- "ssl_certfile": "./tests/tls/client.crt", -- "ssl_ca_certs": "./tests/tls/ca.crt", -- "implementation": ASYNC_REDIS_IMPLEMENTATION, -- }, -- lf("redis_ssl_cluster"), -- marks=pytest.mark.redis_cluster, -- id="redis-ssl-cluster", -- ), -- "redis-sentinel": pytest.param( -- "async+redis+sentinel://localhost:26379/mymaster", -- { -- "use_replicas": False, -- "implementation": ASYNC_REDIS_IMPLEMENTATION, -- }, -- lf("redis_sentinel"), -- marks=pytest.mark.redis_sentinel, -- id="redis-sentinel", -- ), -- "mongodb": pytest.param( -- "async+mongodb://localhost:37017/", -- {}, -- lf("mongodb"), -- marks=pytest.mark.mongodb, -- id="mongodb", -- ), -- "valkey": pytest.param( -- "async+valkey://localhost:12379", -- {}, -- lf("valkey_basic"), -- marks=pytest.mark.valkey, -- id="valkey_basic", -- ), -- "valkey-cluster": pytest.param( -- "async+valkey+cluster://localhost:2001/", -- {}, -- lf("valkey_cluster"), -- marks=pytest.mark.valkey_cluster, -- id="valkey-cluster", -- ), - } - - all_storage = pytest.mark.parametrize("uri, args, fixture", ALL_STORAGES.values()) diff --git a/pkgs/development/python-modules/pympler/default.nix b/pkgs/development/python-modules/pympler/default.nix index 1ea4ea141622..745a578606fe 100644 --- a/pkgs/development/python-modules/pympler/default.nix +++ b/pkgs/development/python-modules/pympler/default.nix @@ -50,6 +50,10 @@ buildPythonPackage rec { "test_edges_new" "test_edges_old" "test_split" + ] + ++ lib.optionals (pythonAtLeast "3.14") [ + # https://github.com/pympler/pympler/issues/177 + "test_untracked_containers" ]; doCheck = stdenv.hostPlatform.isLinux;