From 46ac6bf87f8fcb00146ed5464bd1e8ee206a811a Mon Sep 17 00:00:00 2001 From: Christopher Dignam Date: Tue, 23 Feb 2021 02:28:01 -0500 Subject: [PATCH] [redis] fix pipeline return types (#4989) Pipeline is a subclass of Redis, but instead of the commands returning results, they return Pipeline. --- stubs/redis/redis/client.pyi | 288 +++++++++++++++++++++++++++++++++-- 1 file changed, 273 insertions(+), 15 deletions(-) diff --git a/stubs/redis/redis/client.pyi b/stubs/redis/redis/client.pyi index fb534417b..1d74e6104 100644 --- a/stubs/redis/redis/client.pyi +++ b/stubs/redis/redis/client.pyi @@ -690,25 +690,27 @@ class PubSub: def run_in_thread(self, sleep_time=...): ... def ping(self, message: Optional[_Value] = ...) -> None: ... -class BasePipeline: +class Pipeline(Redis): UNWATCH_COMMANDS: Any connection_pool: Any connection: Any response_callbacks: Any - transaction: Any + transaction: bool shard_hint: Any - watching: Any - def __init__(self, connection_pool, response_callbacks, transaction, shard_hint) -> None: ... - def __enter__(self): ... - def __exit__(self, exc_type, exc_value, traceback): ... - def __del__(self): ... - def __len__(self): ... + watching: bool + command_stack: Any scripts: Any explicit_transaction: Any - def reset(self): ... + def __init__(self, connection_pool, response_callbacks, transaction, shard_hint) -> None: ... + def __enter__(self) -> Pipeline: ... # type: ignore [override] + def __exit__(self, exc_type, exc_value, traceback) -> None: ... + def __del__(self) -> None: ... + def __len__(self) -> int: ... + def __bool__(self) -> bool: ... + def reset(self) -> None: ... def multi(self) -> None: ... - def execute_command(self, *args, **kwargs): ... + def execute_command(self, *args, **options): ... def immediate_execute_command(self, *args, **options): ... def pipeline_execute_command(self, *args, **options): ... def raise_first_error(self, commands, response): ... @@ -717,11 +719,267 @@ class BasePipeline: def load_scripts(self): ... def execute(self, raise_on_error: bool = ...) -> List[Any]: ... def watch(self, *names: _Key) -> bool: ... - def unwatch(self): ... - def script_load_for_pipeline(self, script): ... - -class StrictPipeline(BasePipeline, StrictRedis): ... -class Pipeline(BasePipeline, Redis): ... + def unwatch(self) -> bool: ... + # in the Redis implementation, the following methods are inherited from client. + def set_response_callback(self, command, callback): ... + def pipeline(self, transaction: bool = ..., shard_hint: Any = ...) -> Pipeline: ... # type: ignore [override] + def lock(self, name, timeout=..., sleep=..., blocking_timeout=..., lock_class=..., thread_local=...): ... + def pubsub(self, shard_hint: Any = ..., ignore_subscribe_messages: bool = ...) -> PubSub: ... + def acl_cat(self, category: Optional[Text] = ...) -> Pipeline: ... # type: ignore [override] + def acl_deluser(self, username: Text) -> Pipeline: ... # type: ignore [override] + def acl_genpass(self) -> Pipeline: ... # type: ignore [override] + def acl_getuser(self, username: Text) -> Pipeline: ... # type: ignore [override] + def acl_list(self) -> Pipeline: ... # type: ignore [override] + def acl_load(self) -> Pipeline: ... # type: ignore [override] + def acl_setuser( # type: ignore [override] + self, + username: Text = ..., + enabled: bool = ..., + nopass: bool = ..., + passwords: Optional[Sequence[Text]] = ..., + hashed_passwords: Optional[Sequence[Text]] = ..., + categories: Optional[Sequence[Text]] = ..., + commands: Optional[Sequence[Text]] = ..., + keys: Optional[Sequence[Text]] = ..., + reset: bool = ..., + reset_keys: bool = ..., + reset_passwords: bool = ..., + ) -> Pipeline: ... + def acl_users(self) -> Pipeline: ... # type: ignore [override] + def acl_whoami(self) -> Pipeline: ... # type: ignore [override] + def bgrewriteaof(self) -> Pipeline: ... # type: ignore [override] + def bgsave(self) -> Pipeline: ... # type: ignore [override] + def client_id(self) -> Pipeline: ... # type: ignore [override] + def client_kill(self, address: Text) -> Pipeline: ... # type: ignore [override] + def client_list(self) -> Pipeline: ... # type: ignore [override] + def client_getname(self) -> Pipeline: ... # type: ignore [override] + def client_setname(self, name: Text) -> Pipeline: ... # type: ignore [override] + def readwrite(self) -> Pipeline: ... # type: ignore [override] + def readonly(self) -> Pipeline: ... # type: ignore [override] + def config_get(self, pattern=...) -> Pipeline: ... # type: ignore [override] + def config_set(self, name, value) -> Pipeline: ... # type: ignore [override] + def config_resetstat(self) -> Pipeline: ... # type: ignore [override] + def config_rewrite(self) -> Pipeline: ... # type: ignore [override] + def dbsize(self) -> Pipeline: ... # type: ignore [override] + def debug_object(self, key) -> Pipeline: ... # type: ignore [override] + def echo(self, value) -> Pipeline: ... # type: ignore [override] + def flushall(self) -> Pipeline: ... # type: ignore [override] + def flushdb(self) -> Pipeline: ... # type: ignore [override] + def info(self, section: Optional[_Key] = ...) -> Pipeline: ... # type: ignore [override] + def lastsave(self) -> Pipeline: ... # type: ignore [override] + def object(self, infotype, key) -> Pipeline: ... # type: ignore [override] + def ping(self) -> Pipeline: ... # type: ignore [override] + def save(self) -> Pipeline: ... # type: ignore [override] + def sentinel(self, *args) -> None: ... + def sentinel_get_master_addr_by_name(self, service_name) -> Pipeline: ... # type: ignore [override] + def sentinel_master(self, service_name) -> Pipeline: ... # type: ignore [override] + def sentinel_masters(self) -> Pipeline: ... # type: ignore [override] + def sentinel_monitor(self, name, ip, port, quorum) -> Pipeline: ... # type: ignore [override] + def sentinel_remove(self, name) -> Pipeline: ... # type: ignore [override] + def sentinel_sentinels(self, service_name) -> Pipeline: ... # type: ignore [override] + def sentinel_set(self, name, option, value) -> Pipeline: ... # type: ignore [override] + def sentinel_slaves(self, service_name) -> Pipeline: ... # type: ignore [override] + def shutdown(self) -> None: ... + def slaveof(self, host=..., port=...) -> Pipeline: ... # type: ignore [override] + def slowlog_get(self, num=...) -> Pipeline: ... # type: ignore [override] + def slowlog_len(self) -> Pipeline: ... # type: ignore [override] + def slowlog_reset(self) -> Pipeline: ... # type: ignore [override] + def time(self) -> Pipeline: ... # type: ignore [override] + def append(self, key, value) -> Pipeline: ... # type: ignore [override] + def bitcount(self, key: _Key, start: Optional[int] = ..., end: Optional[int] = ...) -> Pipeline: ... # type: ignore [override] + def bitop(self, operation, dest, *keys) -> Pipeline: ... # type: ignore [override] + def bitpos(self, key, bit, start=..., end=...) -> Pipeline: ... # type: ignore [override] + def decr(self, name, amount=...) -> Pipeline: ... # type: ignore [override] + def delete(self, *names: _Key) -> Pipeline: ... # type: ignore [override] + def __delitem__(self, _Key) -> None: ... + def dump(self, name) -> Pipeline: ... # type: ignore [override] + def exists(self, *names: _Key) -> Pipeline: ... # type: ignore [override] + def __contains__(self, *names: _Key) -> Pipeline: ... # type: ignore [override] + def expire(self, name: _Key, time: Union[int, timedelta]) -> Pipeline: ... # type: ignore [override] + def expireat(self, name, when) -> Pipeline: ... # type: ignore [override] + def get(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def __getitem__(self, name) -> Pipeline: ... # type: ignore [override] + def getbit(self, name: _Key, offset: int) -> Pipeline: ... # type: ignore [override] + def getrange(self, key, start, end) -> Pipeline: ... # type: ignore [override] + def getset(self, name, value) -> Pipeline: ... # type: ignore [override] + def incr(self, name, amount=...) -> Pipeline: ... # type: ignore [override] + def incrby(self, name, amount=...) -> Pipeline: ... # type: ignore [override] + def incrbyfloat(self, name, amount=...) -> Pipeline: ... # type: ignore [override] + def keys(self, pattern=...) -> Pipeline: ... # type: ignore [override] + def mget(self, keys, *args) -> Pipeline: ... # type: ignore [override] + def mset(self, *args, **kwargs) -> Pipeline: ... # type: ignore [override] + def msetnx(self, *args, **kwargs) -> Pipeline: ... # type: ignore [override] + def move(self, name, db) -> Pipeline: ... # type: ignore [override] + def persist(self, name) -> Pipeline: ... # type: ignore [override] + def pexpire(self, name, time) -> Pipeline: ... # type: ignore [override] + def pexpireat(self, name, when) -> Pipeline: ... # type: ignore [override] + def psetex(self, name, time_ms, value) -> Pipeline: ... # type: ignore [override] + def pttl(self, name) -> Pipeline: ... # type: ignore [override] + def randomkey(self) -> Pipeline: ... # type: ignore [override] + def rename(self, src, dst) -> Pipeline: ... # type: ignore [override] + def renamenx(self, src, dst) -> Pipeline: ... # type: ignore [override] + def restore(self, name, ttl, value) -> Pipeline: ... # type: ignore [override] + def set( # type: ignore [override] + self, + name: _Key, + value: _Value, + ex: Union[None, int, timedelta] = ..., + px: Union[None, int, timedelta] = ..., + nx: bool = ..., + xx: bool = ..., + keepttl: bool = ..., + ) -> Pipeline: ... + def __setitem__(self, name, value) -> None: ... + def setbit(self, name: _Key, offset: int, value: int) -> Pipeline: ... # type: ignore [override] + def setex(self, name: _Key, time: Union[int, timedelta], value: _Value) -> Pipeline: ... # type: ignore [override] + def setnx(self, name, value) -> Pipeline: ... # type: ignore [override] + def setrange(self, name, offset, value) -> Pipeline: ... # type: ignore [override] + def strlen(self, name) -> Pipeline: ... # type: ignore [override] + def substr(self, name, start, end=...) -> Pipeline: ... # type: ignore [override] + def ttl(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def type(self, name) -> Pipeline: ... # type: ignore [override] + def unlink(self, *names: _Key) -> Pipeline: ... # type: ignore [override] + def blpop(self, keys: Union[_Value, Iterable[_Value]], timeout: float = ...) -> Pipeline: ... # type: ignore [override] + def brpop(self, keys: Union[_Value, Iterable[_Value]], timeout: float = ...) -> Pipeline: ... # type: ignore [override] + def brpoplpush(self, src, dst, timeout=...) -> Pipeline: ... # type: ignore [override] + def lindex(self, name: _Key, index: int) -> Pipeline: ... # type: ignore [override] + def linsert( # type: ignore [override] + self, name: _Key, where: Literal["BEFORE", "AFTER", "before", "after"], refvalue: _Value, value: _Value + ) -> Pipeline: ... + def llen(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def lpop(self, name) -> Pipeline: ... # type: ignore [override] + def lpush(self, name: _Value, *values: _Value) -> Pipeline: ... # type: ignore [override] + def lpushx(self, name, value) -> Pipeline: ... # type: ignore [override] + def lrange(self, name: _Key, start: int, end: int) -> Pipeline: ... # type: ignore [override] + def lrem(self, name: _Key, count: int, value: _Value) -> Pipeline: ... # type: ignore [override] + def lset(self, name: _Key, index: int, value: _Value) -> Pipeline: ... # type: ignore [override] + def ltrim(self, name: _Key, start: int, end: int) -> Pipeline: ... # type: ignore [override] + def rpop(self, name) -> Pipeline: ... # type: ignore [override] + def rpoplpush(self, src, dst) -> Pipeline: ... # type: ignore [override] + def rpush(self, name: _Value, *values: _Value) -> Pipeline: ... # type: ignore [override] + def rpushx(self, name, value) -> Pipeline: ... # type: ignore [override] + def sort( # type: ignore [override] + self, + name: _Key, + start: Optional[int] = ..., + num: Optional[int] = ..., + by: Optional[_Key] = ..., + get: Optional[Union[_Key, Sequence[_Key]]] = ..., + desc: bool = ..., + alpha: bool = ..., + store: Optional[_Key] = ..., + groups: bool = ..., + ) -> Pipeline: ... + def scan(self, cursor: int = ..., match: Optional[_Key] = ..., count: Optional[int] = ...) -> Pipeline: ... # type: ignore [override] + def scan_iter(self, match: Optional[Text] = ..., count: Optional[int] = ...) -> Iterator[Any]: ... + def sscan(self, name: _Key, cursor: int = ..., match: Text = ..., count: int = ...) -> Pipeline: ... # type: ignore [override] + def sscan_iter(self, name, match=..., count=...) -> Iterator[Any]: ... + def hscan(self, name: _Key, cursor: int = ..., match: Text = ..., count: int = ...) -> Pipeline: ... # type: ignore [override] + def hscan_iter(self, name, match=..., count=...) -> Iterator[Any]: ... + def zscan(self, name, cursor=..., match=..., count=..., score_cast_func=...) -> Pipeline: ... # type: ignore [override] + def zscan_iter(self, name, match=..., count=..., score_cast_func=...) -> Iterator[Any]: ... + def sadd(self, name: _Key, *values: _Value) -> Pipeline: ... # type: ignore [override] + def scard(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def sdiff(self, keys, *args) -> Pipeline: ... # type: ignore [override] + def sdiffstore(self, dest, keys, *args) -> Pipeline: ... # type: ignore [override] + def sinter(self, keys: _Key, *args: _Key) -> Pipeline: ... # type: ignore [override] + def sinterstore(self, dest, keys, *args) -> Pipeline: ... # type: ignore [override] + def sismember(self, name: _Key, value: _Value) -> Pipeline: ... # type: ignore [override] + def smembers(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def smove(self, src, dst, value) -> Pipeline: ... # type: ignore [override] + def spop(self, name, count: Optional[int] = ...) -> Pipeline: ... # type: ignore [override] + def srandmember(self, name: _Key, number: Optional[int] = ...) -> Pipeline: ... # type: ignore [override] + def srem(self, name: _Key, *values: _Value) -> Pipeline: ... # type: ignore [override] + def sunion(self, keys, *args) -> Pipeline: ... # type: ignore [override] + def sunionstore(self, dest, keys, *args) -> Pipeline: ... # type: ignore [override] + def xack(self, name, groupname, *ids) -> Pipeline: ... # type: ignore [override] + def xadd(self, name, fields, id=..., maxlen=..., approximate=...) -> Pipeline: ... # type: ignore [override] + def xclaim( + self, + name, + groupname, + consumername, + min_idle_time, + message_ids, + idle=..., + time=..., + retrycount=..., + force=..., + justid=..., + ) -> Pipeline: ... # type: ignore [override] + def xdel(self, name, *ids) -> Pipeline: ... # type: ignore [override] + def xgroup_create(self, name, groupname, id=..., mkstream=...) -> Pipeline: ... # type: ignore [override] + def xgroup_delconsumer(self, name, groupname, consumername) -> Pipeline: ... # type: ignore [override] + def xgroup_destroy(self, name, groupname) -> Pipeline: ... # type: ignore [override] + def xgroup_setid(self, name, groupname, id) -> Pipeline: ... # type: ignore [override] + def xinfo_consumers(self, name, groupname) -> Pipeline: ... # type: ignore [override] + def xinfo_groups(self, name) -> Pipeline: ... # type: ignore [override] + def xinfo_stream(self, name) -> Pipeline: ... # type: ignore [override] + def xlen(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def xpending(self, name, groupname) -> Pipeline: ... # type: ignore [override] + def xpending_range(self, name, groupname, min, max, count, consumername=...) -> Pipeline: ... # type: ignore [override] + def xrange(self, name, min=..., max=..., count=...) -> Pipeline: ... # type: ignore [override] + def xread(self, streams, count=..., block=...) -> Pipeline: ... # type: ignore [override] + def xreadgroup(self, groupname, consumername, streams, count=..., block=..., noack=...) -> Pipeline: ... # type: ignore [override] + def xrevrange(self, name, max=..., min=..., count=...) -> Pipeline: ... # type: ignore [override] + def xtrim(self, name, maxlen, approximate=...) -> Pipeline: ... # type: ignore [override] + def zadd( # type: ignore [override] + self, name: _Key, mapping: Mapping[_Key, _Value], nx: bool = ..., xx: bool = ..., ch: bool = ..., incr: bool = ... + ) -> Pipeline: ... + def zcard(self, name) -> Pipeline: ... # type: ignore [override] + def zcount(self, name: _Key, min: _Value, max: _Value) -> Pipeline: ... # type: ignore [override] + def zincrby(self, name, value, amount=...) -> Pipeline: ... # type: ignore [override] + def zinterstore(self, dest, keys, aggregate=...) -> Pipeline: ... # type: ignore [override] + def zlexcount(self, name, min, max) -> Pipeline: ... # type: ignore [override] + def zpopmax(self, name, count=...) -> Pipeline: ... # type: ignore [override] + def zpopmin(self, name, count=...) -> Pipeline: ... # type: ignore [override] + def bzpopmax(self, keys, timeout=...) -> Pipeline: ... # type: ignore [override] + def bzpopmin(self, keys, timeout=...) -> Pipeline: ... # type: ignore [override] + def zrange(self, name, start, end, desc=..., withscores=..., score_cast_func=...) -> Pipeline: ... # type: ignore [override] + def zrangebylex(self, name, min, max, start=..., num=...) -> Pipeline: ... # type: ignore [override] + def zrangebyscore(self, name, min, max, start=..., num=..., withscores=..., score_cast_func=...) -> Pipeline: ... # type: ignore [override] + def zrank(self, name: _Key, value: _Key) -> Pipeline: ... # type: ignore [override] + def zrem(self, name, *values) -> Pipeline: ... # type: ignore [override] + def zremrangebylex(self, name, min, max) -> Pipeline: ... # type: ignore [override] + def zremrangebyrank(self, name, min, max) -> Pipeline: ... # type: ignore [override] + def zremrangebyscore(self, name: _Key, min: _Value, max: _Value) -> Pipeline: ... # type: ignore [override] + def zrevrange(self, name, start, end, withscores=..., score_cast_func=...) -> Pipeline: ... # type: ignore [override] + def zrevrangebyscore(self, name, max, min, start=..., num=..., withscores=..., score_cast_func=...) -> Pipeline: ... # type: ignore [override] + def zrevrank(self, name, value) -> Pipeline: ... # type: ignore [override] + def zscore(self, name, value) -> Pipeline: ... # type: ignore [override] + def zunionstore(self, dest, keys, aggregate=...) -> Pipeline: ... # type: ignore [override] + def pfadd(self, name: _Key, *values: _Value) -> Pipeline: ... # type: ignore [override] + def pfcount(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def pfmerge(self, dest: _Key, *sources: _Key) -> Pipeline: ... # type: ignore [override] + def hdel(self, name: _Key, *keys: _Key) -> Pipeline: ... # type: ignore [override] + def hexists(self, name: _Key, key: _Key) -> Pipeline: ... # type: ignore [override] + def hget(self, name: _Key, key: _Key) -> Pipeline: ... # type: ignore [override] + def hgetall(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def hincrby(self, name: _Key, key: _Key, amount: int = ...) -> Pipeline: ... # type: ignore [override] + def hincrbyfloat(self, name: _Key, key: _Key, amount: float = ...) -> Pipeline: ... # type: ignore [override] + def hkeys(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def hlen(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def hset( # type: ignore [override] + self, name: _Key, key: Optional[_Key], value: Optional[_Value], mapping: Optional[Mapping[_Value, _Value]] = ... + ) -> Pipeline: ... + def hsetnx(self, name: _Key, key: _Key, value: _Value) -> Pipeline: ... # type: ignore [override] + def hmset(self, name: _Key, mapping: Mapping[_Value, _Value]) -> Pipeline: ... # type: ignore [override] + def hmget(self, name: _Key, keys: Union[_Key, Iterable[_Key]], *args: _Key) -> Pipeline: ... # type: ignore [override] + def hvals(self, name: _Key) -> Pipeline: ... # type: ignore [override] + def publish(self, channel: _Key, message: _Key) -> Pipeline: ... # type: ignore [override] + def eval(self, script, numkeys, *keys_and_args) -> Pipeline: ... # type: ignore [override] + def evalsha(self, sha, numkeys, *keys_and_args) -> Pipeline: ... # type: ignore [override] + def script_exists(self, *args) -> Pipeline: ... # type: ignore [override] + def script_flush(self) -> Pipeline: ... # type: ignore [override] + def script_kill(self) -> Pipeline: ... # type: ignore [override] + def script_load(self, script) -> Pipeline: ... # type: ignore [override] + def register_script(self, script: Union[Text, _StrType]) -> Script: ... + def pubsub_channels(self, pattern: _Key = ...) -> Pipeline: ... # type: ignore [override] + def pubsub_numsub(self, *args: _Key) -> Pipeline: ... # type: ignore [override] + def pubsub_numpat(self) -> Pipeline: ... # type: ignore [override] + def monitor(self) -> Monitor: ... + def cluster(self, cluster_arg: str, *args: Any) -> Pipeline: ... # type: ignore [override] + def client(self) -> Any: ... class Script: registered_client: Any