Accepting request 1119606 from home:dgarcia:branches:devel:languages:python

- Add pytest.ini source needed to run tests
- Remove/disable broken tests because of suse environment

- drop tox.ini. seems it does no longer exist in 5.0.1
- add support to easily disable the testsuite at build time

- update to 5.0.1
  - 🚀 New Features
    - Provide aclose() / close() for classes requiring lifetime
      management (#2898)
    - Add support for ModuleCommands in cluster (#2951)
    - Add support for multiple values in RPUSHX (#2949)
    - Add Redis.from_pool() class method, for explicitly owning and
      closing a ConnectionPool (#2913)
  - 🐛 Bug Fixes
    - Fixing monitor parsing for messages containing specific
      substrings (#2950)
    - Cluster determine slot command name need to be upper (#2919)
    - Support timeout = 0 in search query (#2934)
    - Fix async sentinel: add push_request keyword argument to
      read_response (#2922)
    - Fix protocol checking for search commands (#2923)
    - Fix: SentinelManagedConnection.read_response() got an
      unexpected keyword argument 'push_request' (#2894)
    - Fix: automatically close connection pool for async Sentinel
      (#2900)
    - Save a reference to created async tasks, to avoid tasks
      potentially disappearing (#2816)
    - Avoid reference cycling by the garbage collector during
      response reading (#2932)

OBS-URL: https://build.opensuse.org/request/show/1119606
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-redis?expand=0&rev=76
This commit is contained in:
Daniel Garcia 2023-10-24 06:29:34 +00:00 committed by Git OBS Bridge
parent e02d989c64
commit d21e817fae
6 changed files with 155 additions and 390 deletions

13
pytest.ini Normal file
View File

@ -0,0 +1,13 @@
[pytest]
addopts = -s
markers =
redismod: run only the redis module tests
pipeline: pipeline tests
onlycluster: marks tests to be run only with cluster mode redis
onlynoncluster: marks tests to be run only with standalone redis
ssl: marker for only the ssl tests
asyncio: marker for async tests
replica: replica tests
experimental: run only experimental tests
asyncio_mode = auto
timeout = 30

View File

@ -1,3 +1,114 @@
-------------------------------------------------------------------
Mon Oct 23 10:42:41 UTC 2023 - Daniel Garcia <daniel.garcia@suse.com>
- Add pytest.ini source needed to run tests
- Remove/disable broken tests because of suse environment
-------------------------------------------------------------------
Fri Oct 20 09:55:28 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- drop tox.ini. seems it does no longer exist in 5.0.1
- add support to easily disable the testsuite at build time
-------------------------------------------------------------------
Fri Oct 20 09:38:34 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- update to 5.0.1
- 🚀 New Features
- Provide aclose() / close() for classes requiring lifetime
management (#2898)
- Add support for ModuleCommands in cluster (#2951)
- Add support for multiple values in RPUSHX (#2949)
- Add Redis.from_pool() class method, for explicitly owning and
closing a ConnectionPool (#2913)
- 🐛 Bug Fixes
- Fixing monitor parsing for messages containing specific
substrings (#2950)
- Cluster determine slot command name need to be upper (#2919)
- Support timeout = 0 in search query (#2934)
- Fix async sentinel: add push_request keyword argument to
read_response (#2922)
- Fix protocol checking for search commands (#2923)
- Fix: SentinelManagedConnection.read_response() got an
unexpected keyword argument 'push_request' (#2894)
- Fix: automatically close connection pool for async Sentinel
(#2900)
- Save a reference to created async tasks, to avoid tasks
potentially disappearing (#2816)
- Avoid reference cycling by the garbage collector during
response reading (#2932)
- 🧰 Maintenance
- Type hint improvements (#2952)
- Replace clear_connect_callbacks with
_deregister_connect_callback (#2955)
- Async fixes, remove del and other things (#2870)
- Add pagination, sorting and grouping examples to search json
example (#2890)
- Remove process-id checks from asyncio. Asyncio and fork()
does not mix. (#2911)
- Fix resource usage and cleanup Mocks in the unit tests
(#2936)
- Remove mentions of tox (#2929)
- Add 7.2 to supported Redis versions (#2896)
- Fix resource warnings in unit tests (#2899)
- Fix typo in redis-stream-example.ipynb (#2918)
- Deprecate RedisGraph (#2927)
- Fix redis 7.2.0 tests (#2902)
- Fix test_scorer (search) (#2920)
- changes from 5.0.0
- What's new?
- Triggers and Functions support Triggers and Functions allow
you to execute server-side functions triggered when key
values are modified or created in Redis, a stream entry
arrival, or explicitly calling them. Simply put, you can
replace Lua scripts with easy-to-develop JavaScript or
TypeScript code. Move your business logic closer to the data
to ensure a lower latency, and forget about updating
dependent key values manually in your code. Try it for
yourself with Quick start
- Full Redis 7.2 and RESP3 support
- Python 3.7 End-of-Life
- Python 3.7 has reached its end-of-life (EOL) as of June
2023. This means that starting from this date, Python 3.7
will no longer receive any updates, including security
patches, bug fixes, or improvements. If you continue to use
Python 3.7 post-EOL, you may expose your projects and
systems to potential security vulnerabilities. We ended its
support in this version and strongly recommend migrating to
Python 3.10.
- 🐛 Bug Fixes
- Fix timeout retrying on pipeline execution (#2812)
- Fix socket garbage collection (#2859)
- 🧰 Maintenance
- Updating client license to clear, MIT (#2884)
- Add py.typed in accordance with PEP-561 (#2738)
- Dependabot label change (#2880)
- Fix type hints in SearchCommands (#2817)
- Add sync modules (except search) tests to cluster CI (#2850)
- Fix a duplicate word in CONTRIBUTING.md (#2848)
- Fixing doc builds (#2869)
- Change cluster docker to edge and enable debug command
(#2853)
- changes from 4.6.0
- 🧪 Experimental Features
- Support JSON.MERGE command (#2761)
- Support JSON.MSET command (#2766)
- 🚀 New Features
- Extract abstract async connection class (#2734)
- Add support for WAITAOF (#2760)
- Introduce OutOfMemoryError exception for Redis write command rejections due to OOM errors (#2778)
- Add WITHSCORE argument to ZRANK (#2758)
- 🐛 Bug Fixes
- Fix dead weakref in sentinel connection causing ReferenceError (#2767) (#2771)
- Fix Key Error in parse_xinfo_stream (#2788)
- Remove unnecessary __del__ handlers (#2755)
- Added support for missing argument to SentinelManagedConnection.read_response() (#2756)
- 🧰 Maintenance
- Fix type hint for retry_on_error in async cluster (#2804)
- Clean up documents and fix some redirects (#2801)
- Add unit tests for the connect method of all Redis connection classes (#2631)
- Docstring formatting fix (#2796)
-------------------------------------------------------------------
Sat May 20 12:11:45 UTC 2023 - Andreas Stieger <Andreas.Stieger@gmx.de>
@ -634,6 +745,11 @@ Tue Mar 26 09:36:48 UTC 2019 - John Vandenberg <jayvdb@gmail.com>
* Fix SentinelConnectionPool to work in multiprocess/forked
environments
-------------------------------------------------------------------
Tue Feb 19 17:50:40 UTC 2019 - Marcus Rueckert <mrueckert@suse.de>
- downgrade requires for redis to recommends
-------------------------------------------------------------------
Mon Feb 18 08:54:01 UTC 2019 - sebix+novell.com@sebix.at

View File

@ -16,15 +16,17 @@
#
%bcond_without testing
%{?sle15_python_module_pythons}
Name: python-redis
Version: 4.5.5
Version: 5.0.1
Release: 0
Summary: Python client for Redis key-value store
License: MIT
URL: https://github.com/redis/redis-py
Source0: https://files.pythonhosted.org/packages/source/r/redis/redis-%{version}.tar.gz
Source1: https://github.com/redis/redis-py/raw/v%{version}/tox.ini
Source1: https://raw.githubusercontent.com/redis/redis-py/5.0/pytest.ini
BuildRequires: %{python_module async-timeout >= 4.0.2}
BuildRequires: %{python_module base >= 3.7}
BuildRequires: %{python_module packaging}
@ -35,10 +37,12 @@ BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: psmisc
BuildRequires: python-rpm-macros
%if %{with testing}
BuildRequires: redis
%endif
Requires: python-async-timeout >= 4.0.2
Requires: redis
Recommends: python-hiredis >= 1.0.0
Recommends: redis
BuildArch: noarch
%python_subpackages
@ -47,8 +51,15 @@ The Python interface to the Redis key-value store.
%prep
%autosetup -p1 -n redis-%{version}
# tox.ini for pytest markers
cp %{SOURCE1} .
# pytest.ini for pytest markers
cp %SOURCE1 .
# The openSUSE redis json, bloom, ts and
# graph are missing in the repos
rm tests/test_bloom.py
rm tests/test_graph.py
rm tests/test_json.py
rm tests/test_timeseries.py
%build
%python_build
@ -57,6 +68,7 @@ cp %{SOURCE1} .
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%if %{with testing}
%check
# upstream's tox testsuite starts several servers in docker containers listening on different ports.
# We just start two of them locally
@ -80,9 +92,12 @@ if [ $(getconf LONG_BIT) -ne 64 ]; then
# reference precision issues on 32-bit
donttest=" or test_geopos"
fi
# gh#redis/redis-py#2554 and gh#redis/redis-py#2679
donttest="$donttest or test_xautoclaim or test_acl_list"
%pytest -m 'not (onlycluster or redismod)' -k "not (dummyprefix $donttest)" --ignore tests/test_ssl.py --ignore tests/test_asyncio/test_cluster.py --redis-url=redis://localhost:6379/
# gh#redis/redis-py#2554
donttest="$donttest or test_xautoclaim"
# gh#redis/redis-py#2679
donttest+=" or test_acl_getuser_setuser or test_acl_log"
%pytest -m 'not (onlycluster or redismod or ssl)' -k "not (dummyprefix $donttest)" --ignore tests/test_ssl.py --ignore tests/test_asyncio/test_cluster.py --redis-url=redis://localhost:6379/
%endif
%files %{python_files}
%license LICENSE

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc87a0bdef6c8bfe1ef1e1c40be7034390c2ae02d92dcd0c7ca1729443899880
size 4557115

BIN
redis-5.0.1.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

379
tox.ini
View File

@ -1,379 +0,0 @@
[pytest]
addopts = -s
markers =
redismod: run only the redis module tests
pipeline: pipeline tests
onlycluster: marks tests to be run only with cluster mode redis
onlynoncluster: marks tests to be run only with standalone redis
ssl: marker for only the ssl tests
asyncio: marker for async tests
replica: replica tests
experimental: run only experimental tests
asyncio_mode = auto
[tox]
minversion = 3.2.0
requires = tox-docker
envlist = {standalone,cluster}-{plain,hiredis,ocsp}-{uvloop,asyncio}-{py37,py38,py39,pypy3},linters,docs
[docker:master]
name = master
image = redisfab/redis-py:6.2.6
ports =
6379:6379/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6379)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis6.2/master/redis.conf:/redis.conf
[docker:replica]
name = replica
image = redisfab/redis-py:6.2.6
links =
master:master
ports =
6380:6380/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6380)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis6.2/replica/redis.conf:/redis.conf
[docker:unstable]
name = unstable
image = redisfab/redis-py:unstable
ports =
6378:6378/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6378)) else False"
volumes =
bind:rw:{toxinidir}/docker/unstable/redis.conf:/redis.conf
[docker:unstable_cluster]
name = unstable_cluster
image = redisfab/redis-py-cluster:unstable
ports =
6372:6372/tcp
6373:6373/tcp
6374:6374/tcp
6375:6375/tcp
6376:6376/tcp
6377:6377/tcp
healtcheck_cmd = python -c "import socket;print(True) if all([0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',port)) for port in range(6372,6377)]) else False"
volumes =
bind:rw:{toxinidir}/docker/unstable_cluster/redis.conf:/redis.conf
[docker:sentinel_1]
name = sentinel_1
image = redisfab/redis-py-sentinel:6.2.6
links =
master:master
ports =
26379:26379/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26379)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis6.2/sentinel/sentinel_1.conf:/sentinel.conf
[docker:sentinel_2]
name = sentinel_2
image = redisfab/redis-py-sentinel:6.2.6
links =
master:master
ports =
26380:26380/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26380)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis6.2/sentinel/sentinel_2.conf:/sentinel.conf
[docker:sentinel_3]
name = sentinel_3
image = redisfab/redis-py-sentinel:6.2.6
links =
master:master
ports =
26381:26381/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26381)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis6.2/sentinel/sentinel_3.conf:/sentinel.conf
[docker:redis_stack]
name = redis_stack
image = redis/redis-stack-server:edge
ports =
36379:6379/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',36379)) else False"
[docker:redis_cluster]
name = redis_cluster
image = redisfab/redis-py-cluster:6.2.6
ports =
16379:16379/tcp
16380:16380/tcp
16381:16381/tcp
16382:16382/tcp
16383:16383/tcp
16384:16384/tcp
healtcheck_cmd = python -c "import socket;print(True) if all([0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',port)) for port in range(16379,16384)]) else False"
volumes =
bind:rw:{toxinidir}/docker/cluster/redis.conf:/redis.conf
[docker:redismod_cluster]
name = redismod_cluster
image = redisfab/redis-py-modcluster:edge
ports =
46379:46379/tcp
46380:46380/tcp
46381:46381/tcp
46382:46382/tcp
46383:46383/tcp
46384:46384/tcp
healtcheck_cmd = python -c "import socket;print(True) if all([0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',port)) for port in range(46379,46384)]) else False"
volumes =
bind:rw:{toxinidir}/docker/redismod_cluster/redis.conf:/redis.conf
[docker:stunnel]
name = stunnel
image = redisfab/stunnel:latest
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6666)) else False"
links =
master:master
ports =
6666:6666/tcp
volumes =
bind:ro:{toxinidir}/docker/stunnel/conf:/etc/stunnel/conf.d
bind:ro:{toxinidir}/docker/stunnel/keys:/etc/stunnel/keys
[docker:redis5_master]
name = redis5_master
image = redisfab/redis-py:5.0-buster
ports =
6382:6382/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6382)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis5/master/redis.conf:/redis.conf
[docker:redis5_replica]
name = redis5_replica
image = redisfab/redis-py:5.0-buster
links =
redis5_master:redis5_master
ports =
6383:6383/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6383)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis5/replica/redis.conf:/redis.conf
[docker:redis5_sentinel_1]
name = redis5_sentinel_1
image = redisfab/redis-py-sentinel:5.0-buster
links =
redis5_master:redis5_master
ports =
26382:26382/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26382)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis5/sentinel/sentinel_1.conf:/sentinel.conf
[docker:redis5_sentinel_2]
name = redis5_sentinel_2
image = redisfab/redis-py-sentinel:5.0-buster
links =
redis5_master:redis5_master
ports =
26383:26383/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26383)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis5/sentinel/sentinel_2.conf:/sentinel.conf
[docker:redis5_sentinel_3]
name = redis5_sentinel_3
image = redisfab/redis-py-sentinel:5.0-buster
links =
redis5_master:redis5_master
ports =
26384:26384/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26384)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis5/sentinel/sentinel_3.conf:/sentinel.conf
[docker:redis5_cluster]
name = redis5_cluster
image = redisfab/redis-py-cluster:5.0-buster
ports =
16385:16385/tcp
16386:16386/tcp
16387:16387/tcp
16388:16388/tcp
16389:16389/tcp
16390:16390/tcp
healtcheck_cmd = python -c "import socket;print(True) if all([0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',port)) for port in range(16385,16390)]) else False"
volumes =
bind:rw:{toxinidir}/docker/cluster/redis.conf:/redis.conf
[docker:redis4_master]
name = redis4_master
image = redisfab/redis-py:4.0-buster
ports =
6381:6381/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',6381)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis4/master/redis.conf:/redis.conf
[docker:redis4_sentinel_1]
name = redis4_sentinel_1
image = redisfab/redis-py-sentinel:4.0-buster
links =
redis4_master:redis4_master
ports =
26385:26385/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26385)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis4/sentinel/sentinel_1.conf:/sentinel.conf
[docker:redis4_sentinel_2]
name = redis4_sentinel_2
image = redisfab/redis-py-sentinel:4.0-buster
links =
redis4_master:redis4_master
ports =
26386:26386/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26386)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis4/sentinel/sentinel_2.conf:/sentinel.conf
[docker:redis4_sentinel_3]
name = redis4_sentinel_3
image = redisfab/redis-py-sentinel:4.0-buster
links =
redis4_master:redis4_master
ports =
26387:26387/tcp
healtcheck_cmd = python -c "import socket;print(True) if 0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',26387)) else False"
volumes =
bind:rw:{toxinidir}/docker/redis4/sentinel/sentinel_3.conf:/sentinel.conf
[docker:redis4_cluster]
name = redis4_cluster
image = redisfab/redis-py-cluster:4.0-buster
ports =
16391:16391/tcp
16392:16392/tcp
16393:16393/tcp
16394:16394/tcp
16395:16395/tcp
16396:16396/tcp
healtcheck_cmd = python -c "import socket;print(True) if all([0 == socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex(('127.0.0.1',port)) for port in range(16391,16396)]) else False"
volumes =
bind:rw:{toxinidir}/docker/cluster/redis.conf:/redis.conf
[isort]
profile = black
multi_line_output = 3
[testenv]
deps =
-r {toxinidir}/requirements.txt
-r {toxinidir}/dev_requirements.txt
docker =
unstable
unstable_cluster
master
replica
sentinel_1
sentinel_2
sentinel_3
redis_cluster
redis_stack
stunnel
extras =
hiredis: hiredis
ocsp: cryptography, pyopenssl, requests
setenv =
CLUSTER_URL = "redis://localhost:16379/0"
UNSTABLE_CLUSTER_URL = "redis://localhost:6372/0"
commands =
standalone: pytest --cov=./ --cov-report=xml:coverage_redis.xml -W always -m 'not onlycluster' --junit-xml=standalone-results.xml {posargs}
standalone-uvloop: pytest --cov=./ --cov-report=xml:coverage_redis.xml -W always -m 'not onlycluster' --junit-xml=standalone-uvloop-results.xml --uvloop {posargs}
cluster: pytest --cov=./ --cov-report=xml:coverage_cluster.xml -W always -m 'not onlynoncluster and not redismod' --redis-url={env:CLUSTER_URL:} --redis-unstable-url={env:UNSTABLE_CLUSTER_URL:} --junit-xml=cluster-results.xml {posargs}
cluster-uvloop: pytest --cov=./ --cov-report=xml:coverage_cluster.xml -W always -m 'not onlynoncluster and not redismod' --redis-url={env:CLUSTER_URL:} --redis-unstable-url={env:UNSTABLE_CLUSTER_URL:} --junit-xml=cluster-uvloop-results.xml --uvloop {posargs}
[testenv:redis5]
deps =
-r {toxinidir}/requirements.txt
-r {toxinidir}/dev_requirements.txt
docker =
redis5_master
redis5_replica
redis5_sentinel_1
redis5_sentinel_2
redis5_sentinel_3
redis5_cluster
extras =
hiredis: hiredis
cryptography: cryptography, requests
setenv =
CLUSTER_URL = "redis://localhost:16385/0"
commands =
standalone: pytest --cov=./ --cov-report=xml:coverage_redis.xml -W always -m 'not onlycluster and not redismod' {posargs}
cluster: pytest --cov=./ --cov-report=xml:coverage_cluster.xml -W always -m 'not onlynoncluster and not redismod' --redis-url={env:CLUSTER_URL:} {posargs}
[testenv:redis4]
deps =
-r {toxinidir}/requirements.txt
-r {toxinidir}/dev_requirements.txt
docker =
redis4_master
redis4_sentinel_1
redis4_sentinel_2
redis4_sentinel_3
redis4_cluster
extras =
hiredis: hiredis
cryptography: cryptography, requests
setenv =
CLUSTER_URL = "redis://localhost:16391/0"
commands =
standalone: pytest --cov=./ --cov-report=xml:coverage_redis.xml -W always -m 'not onlycluster and not redismod' {posargs}
cluster: pytest --cov=./ --cov-report=xml:coverage_cluster.xml -W always -m 'not onlynoncluster and not redismod' --redis-url={env:CLUSTER_URL:} {posargs}
[testenv:devenv]
skipsdist = true
skip_install = true
deps = -r {toxinidir}/dev_requirements.txt
docker = {[testenv]docker}
[testenv:linters]
deps_files = dev_requirements.txt
docker =
commands =
flake8
black --target-version py37 --check --diff .
isort --check-only --diff .
vulture redis whitelist.py --min-confidence 80
flynt --fail-on-change --dry-run .
skipsdist = true
skip_install = true
[testenv:docs]
deps = -r docs/requirements.txt
docker =
changedir = {toxinidir}/docs
allowlist_externals = make
commands = make html
[flake8]
max-line-length = 88
exclude =
*.egg-info,
*.pyc,
.git,
.tox,
.venv*,
build,
docs/*,
dist,
docker,
venv*,
.venv*,
whitelist.py
ignore =
F405
W503
E203
E126