Merging upstream version 1.14.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
455e66126a
commit
cd1500a24a
19 changed files with 152 additions and 114 deletions
|
@ -1,5 +1,5 @@
|
||||||
[bumpversion]
|
[bumpversion]
|
||||||
current_version = 1.13.2
|
current_version = 1.14.0
|
||||||
commit = True
|
commit = True
|
||||||
tag = True
|
tag = True
|
||||||
|
|
||||||
|
|
7
.dockerignore
Normal file
7
.dockerignore
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
tests
|
||||||
|
scripts
|
||||||
|
CHANGELOG.md
|
||||||
|
Dockerfile
|
||||||
|
docs
|
||||||
|
pyoxidizer.template.bzl
|
||||||
|
redis-doc
|
3
.github/workflows/test.yaml
vendored
3
.github/workflows/test.yaml
vendored
|
@ -10,10 +10,11 @@ jobs:
|
||||||
test:
|
test:
|
||||||
name: Pytest
|
name: Pytest
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: ["ubuntu-20.04"]
|
os: ["ubuntu-20.04"]
|
||||||
python: ["3.7", "3.8", "3.9", "3.10", "3.11.1"]
|
python: ["3.7", "3.8", "3.9", "3.10", "3.11.1"]
|
||||||
redis: [5, 6, 7]
|
redis: [5, 6, 7, 7.2]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
27
CHANGELOG.md
27
CHANGELOG.md
|
@ -1,23 +1,32 @@
|
||||||
## UPCOMING
|
## UPCOMING
|
||||||
|
|
||||||
## 1.3.1
|
## 1.14
|
||||||
|
|
||||||
|
- Dependency: upgrade redis-py to 5 (thanks to [chayim])
|
||||||
|
- Feature: porting to redis-server 7.2 now
|
||||||
|
- Feature: supports python 3.10, 3.11 now
|
||||||
|
- Doc: update commands.json from redis-doc to latest version
|
||||||
|
|
||||||
|
## 1.13.2
|
||||||
|
|
||||||
- Dependency: upgrade markdown render mistune to v3
|
- Dependency: upgrade markdown render mistune to v3
|
||||||
- Dependency: deprecated importlib_resources, use Python build in `importlib.resources` now
|
- Dependency: deprecated importlib_resources, use Python build in
|
||||||
|
`importlib.resources` now
|
||||||
- Dependency: upgrade redis-py to 4.5
|
- Dependency: upgrade redis-py to 4.5
|
||||||
- Doc: update homepage link to iredis.xbin.io
|
- Doc: update homepage link to iredis.xbin.io
|
||||||
- Bugfix: Fix restore command caused by string literal escape
|
- Bugfix: Fix restore command caused by string literal escape
|
||||||
|
|
||||||
## 1.3
|
## 1.13
|
||||||
|
|
||||||
- Dependency: Drop Python 3.6 support.
|
- Dependency: Drop Python 3.6 support.
|
||||||
- Bugfix: fix some typos.
|
- Bugfix: fix some typos.
|
||||||
|
|
||||||
### 1.12.2
|
### 1.12.2
|
||||||
|
|
||||||
- Feature: IRedis now honors the `ssl_cert_reqs` strategy, either specifying it via
|
- Feature: IRedis now honors the `ssl_cert_reqs` strategy, either specifying it
|
||||||
command line (`--verify-ssl=<none|optional|required>`) or as an url parameter (`ssl_cert_reqs`)
|
via command line (`--verify-ssl=<none|optional|required>`) or as an url
|
||||||
when the connection is secured via tls (`rediss://`). (authored by [torrefatto])
|
parameter (`ssl_cert_reqs`) when the connection is secured via tls
|
||||||
|
(`rediss://`). (authored by [torrefatto])
|
||||||
|
|
||||||
### 1.12.1
|
### 1.12.1
|
||||||
|
|
||||||
|
@ -25,7 +34,8 @@
|
||||||
- Bugfix: all tests pass on redis:7 now.
|
- Bugfix: all tests pass on redis:7 now.
|
||||||
- Feature: IRedis now accept `username` for auth, redis server version under 6
|
- Feature: IRedis now accept `username` for auth, redis server version under 6
|
||||||
will ignore `username`.
|
will ignore `username`.
|
||||||
- Feature: IRedis support prompt now, you can customize prompt string. (thanks to [aymericbeaumet])
|
- Feature: IRedis support prompt now, you can customize prompt string. (thanks
|
||||||
|
to [aymericbeaumet])
|
||||||
|
|
||||||
## 1.12
|
## 1.12
|
||||||
|
|
||||||
|
@ -278,7 +288,7 @@
|
||||||
|
|
||||||
### 0.8.12
|
### 0.8.12
|
||||||
|
|
||||||
- Bugfix: Multi spaces between commands can be recongnised as correct commands
|
- Bugfix: Multi spaces between commands can be recognised as correct commands
|
||||||
now.
|
now.
|
||||||
- Feature: Warning on dangerous command.
|
- Feature: Warning on dangerous command.
|
||||||
|
|
||||||
|
@ -316,3 +326,4 @@
|
||||||
[tssujt]: https://github.com/tssujt
|
[tssujt]: https://github.com/tssujt
|
||||||
[aymericbeaumet]: https://github.com/aymericbeaumet
|
[aymericbeaumet]: https://github.com/aymericbeaumet
|
||||||
[torrefatto]: https://github.com/torrefatto
|
[torrefatto]: https://github.com/torrefatto
|
||||||
|
[chayim]: https://github.com/chayim
|
||||||
|
|
28
Dockerfile
28
Dockerfile
|
@ -1,18 +1,16 @@
|
||||||
FROM python:3
|
FROM redis/redis-stack-server:latest
|
||||||
|
|
||||||
|
COPY . /iredis
|
||||||
|
|
||||||
|
RUN apt-get update --fix-missing
|
||||||
|
RUN apt-get install -yqq python3 python3-pip python-is-python3
|
||||||
|
RUN python3 -m pip install poetry
|
||||||
WORKDIR /iredis
|
WORKDIR /iredis
|
||||||
COPY README.md poetry.lock pyproject.toml ./
|
RUN poetry config virtualenvs.create false
|
||||||
COPY iredis ./iredis
|
RUN poetry build
|
||||||
|
RUN pip install dist/iredis*.tar.gz
|
||||||
|
WORKDIR /
|
||||||
|
RUN rm -rf .cache /var/cache/apt
|
||||||
|
RUN rm -rf /iredis
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --allow-unauthenticated \
|
CMD ["sh", "-c", "/opt/redis-stack/bin/redis-stack-server --daemonize yes && iredis"]
|
||||||
redis-server && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
|
|
||||||
RUN python3 -m venv iredis_env && \
|
|
||||||
. iredis_env/bin/activate && \
|
|
||||||
pip install poetry && \
|
|
||||||
poetry install --no-dev && \
|
|
||||||
rm -rf ~/.cache
|
|
||||||
|
|
||||||
CMD ["sh","-c","redis-server --daemonize yes && . iredis_env/bin/activate && iredis"]
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/laixintao/iredis/actions"><img src="https://github.com/laixintao/iredis/workflows/Test/badge.svg" alt="Github Action"></a>
|
<a href="https://github.com/laixintao/iredis/actions"><img src="https://github.com/laixintao/iredis/workflows/Test/badge.svg" alt="Github Action"></a>
|
||||||
<a href="https://badge.fury.io/py/iredis"><img src="https://badge.fury.io/py/iredis.svg" alt="PyPI version"></a>
|
<a href="https://badge.fury.io/py/iredis"><img src="https://badge.fury.io/py/iredis.svg" alt="PyPI version"></a>
|
||||||
<img src="https://badgen.net/badge/python/3.6%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10/" alt="Python version">
|
<img src="https://badgen.net/badge/python/3.7%20%7C%203.8%20%7C%203.9%20%7C%203.10%20%7C%203.11" alt="Python version">
|
||||||
<a href="https://pepy.tech/project/iredis"><img src="https://pepy.tech/badge/iredis" alt="Download stats"></a>
|
<a href="https://pepy.tech/project/iredis"><img src="https://pepy.tech/badge/iredis" alt="Download stats"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
__version__ = "1.13.2"
|
__version__ = "1.14.0"
|
||||||
|
|
|
@ -95,6 +95,7 @@ class Client:
|
||||||
try:
|
try:
|
||||||
self.connection.connect()
|
self.connection.connect()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
logger.exception("Can not create connection to server")
|
||||||
print(str(e), file=sys.stderr)
|
print(str(e), file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
if not config.no_info:
|
if not config.no_info:
|
||||||
|
|
|
@ -63,6 +63,8 @@ class Config:
|
||||||
self.withscores = False
|
self.withscores = False
|
||||||
self.version = "Unknown"
|
self.version = "Unknown"
|
||||||
|
|
||||||
|
self.greetings = True
|
||||||
|
|
||||||
self.prompt = None
|
self.prompt = None
|
||||||
|
|
||||||
def __setter__(self, name, value):
|
def __setter__(self, name, value):
|
||||||
|
@ -129,5 +131,6 @@ def load_config_files(iredisrc):
|
||||||
config.pager = config_obj["main"].get("pager")
|
config.pager = config_obj["main"].get("pager")
|
||||||
config.enable_pager = config_obj["main"].as_bool("enable_pager")
|
config.enable_pager = config_obj["main"].as_bool("enable_pager")
|
||||||
config.prompt = config_obj["main"].get("prompt")
|
config.prompt = config_obj["main"].get("prompt")
|
||||||
|
config.greetings = config_obj["main"].as_bool("greetings")
|
||||||
|
|
||||||
return config_obj
|
return config_obj
|
||||||
|
|
|
@ -76,6 +76,10 @@ prompt =
|
||||||
# History file location
|
# History file location
|
||||||
history_location = ~/.iredis_history
|
history_location = ~/.iredis_history
|
||||||
|
|
||||||
|
# if set to True, will display version information on startup
|
||||||
|
# can set to False to disable it.
|
||||||
|
greetings = True
|
||||||
|
|
||||||
[alias_dsn]
|
[alias_dsn]
|
||||||
# example_dsn = redis://[[username]:[password]]@localhost:6379/0
|
# example_dsn = redis://[[username]:[password]]@localhost:6379/0
|
||||||
# example_dsn = rediss://[[username]:[password]]@localhost:6379/0
|
# example_dsn = rediss://[[username]:[password]]@localhost:6379/0
|
||||||
|
|
|
@ -61,8 +61,8 @@ def greetings():
|
||||||
reason = ""
|
reason = ""
|
||||||
|
|
||||||
server_version = f"redis-server {config.version} {reason}"
|
server_version = f"redis-server {config.version} {reason}"
|
||||||
home_page = "Home: https://iredis.io"
|
home_page = "Home: https://iredis.xbin.io/"
|
||||||
issues = "Issues: https://iredis.io/issues"
|
issues = "Issues: https://github.com/laixintao/iredis/issues"
|
||||||
display = "\n".join([iredis_version, server_version, home_page, issues])
|
display = "\n".join([iredis_version, server_version, home_page, issues])
|
||||||
if config.raw:
|
if config.raw:
|
||||||
display = display.encode()
|
display = display.encode()
|
||||||
|
@ -177,9 +177,9 @@ def repl(client, session, start_time):
|
||||||
try:
|
try:
|
||||||
command = session.prompt(
|
command = session.prompt(
|
||||||
prompt_message(client),
|
prompt_message(client),
|
||||||
bottom_toolbar=BottomToolbar(command_holder).render
|
bottom_toolbar=(
|
||||||
if config.bottom_bar
|
BottomToolbar(command_holder).render if config.bottom_bar else None
|
||||||
else None,
|
),
|
||||||
input_processors=[
|
input_processors=[
|
||||||
UpdateBottomProcessor(command_holder, session),
|
UpdateBottomProcessor(command_holder, session),
|
||||||
PasswordProcessor(),
|
PasswordProcessor(),
|
||||||
|
@ -274,6 +274,12 @@ VERIFY_SSL_HELP = """Set the TLS certificate verification strategy"""
|
||||||
@click.option("--rainbow/--no-rainbow", default=None, is_flag=True, help=RAINBOW)
|
@click.option("--rainbow/--no-rainbow", default=None, is_flag=True, help=RAINBOW)
|
||||||
@click.option("--shell/--no-shell", default=None, is_flag=True, help=SHELL)
|
@click.option("--shell/--no-shell", default=None, is_flag=True, help=SHELL)
|
||||||
@click.option("--pager/--no-pager", default=None, is_flag=True, help=PAGER_HELP)
|
@click.option("--pager/--no-pager", default=None, is_flag=True, help=PAGER_HELP)
|
||||||
|
@click.option(
|
||||||
|
"--greetings/--no-greetings",
|
||||||
|
default=None,
|
||||||
|
is_flag=True,
|
||||||
|
help="Enable or disable greeting messages",
|
||||||
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--verify-ssl",
|
"--verify-ssl",
|
||||||
default=None,
|
default=None,
|
||||||
|
@ -309,6 +315,7 @@ def gather_args(
|
||||||
socket,
|
socket,
|
||||||
shell,
|
shell,
|
||||||
pager,
|
pager,
|
||||||
|
greetings,
|
||||||
verify_ssl,
|
verify_ssl,
|
||||||
prompt,
|
prompt,
|
||||||
):
|
):
|
||||||
|
@ -354,6 +361,8 @@ def gather_args(
|
||||||
config.enable_pager = pager
|
config.enable_pager = pager
|
||||||
if verify_ssl is not None:
|
if verify_ssl is not None:
|
||||||
config.verify_ssl = verify_ssl
|
config.verify_ssl = verify_ssl
|
||||||
|
if greetings is not None:
|
||||||
|
config.greetings = greetings
|
||||||
|
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
@ -492,5 +501,6 @@ def main():
|
||||||
)
|
)
|
||||||
|
|
||||||
# print hello message
|
# print hello message
|
||||||
|
if config.greetings:
|
||||||
greetings()
|
greetings()
|
||||||
repl(client, session, enter_main_time)
|
repl(client, session, enter_main_time)
|
||||||
|
|
57
poetry.lock
generated
57
poetry.lock
generated
|
@ -16,15 +16,19 @@ typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""}
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "click"
|
name = "click"
|
||||||
version = "7.1.2"
|
version = "8.1.7"
|
||||||
description = "Composable command line interface toolkit"
|
description = "Composable command line interface toolkit"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
|
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
|
||||||
{file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
|
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorama"
|
name = "colorama"
|
||||||
version = "0.4.6"
|
version = "0.4.6"
|
||||||
|
@ -97,29 +101,26 @@ files = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mistune"
|
name = "mistune"
|
||||||
version = "3.0.1"
|
version = "3.0.2"
|
||||||
description = "A sane and fast Markdown parser with useful plugins and renderers"
|
description = "A sane and fast Markdown parser with useful plugins and renderers"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"},
|
{file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"},
|
||||||
{file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"},
|
{file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "packaging"
|
name = "packaging"
|
||||||
version = "21.3"
|
version = "23.2"
|
||||||
description = "Core utilities for Python packages"
|
description = "Core utilities for Python packages"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
{file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
|
||||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
{file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pendulum"
|
name = "pendulum"
|
||||||
version = "2.1.2"
|
version = "2.1.2"
|
||||||
|
@ -225,29 +226,15 @@ files = [
|
||||||
[package.extras]
|
[package.extras]
|
||||||
plugins = ["importlib-metadata"]
|
plugins = ["importlib-metadata"]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pyparsing"
|
|
||||||
version = "3.1.1"
|
|
||||||
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6.8"
|
|
||||||
files = [
|
|
||||||
{file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"},
|
|
||||||
{file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
diagrams = ["jinja2", "railroad-diagrams"]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
version = "7.4.2"
|
version = "7.4.3"
|
||||||
description = "pytest: simple powerful testing with Python"
|
description = "pytest: simple powerful testing with Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"},
|
{file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
|
||||||
{file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"},
|
{file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
@ -289,13 +276,13 @@ files = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redis"
|
name = "redis"
|
||||||
version = "4.6.0"
|
version = "5.0.1"
|
||||||
description = "Python client for Redis database and key-value store"
|
description = "Python client for Redis database and key-value store"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"},
|
{file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"},
|
||||||
{file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"},
|
{file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
@ -369,4 +356,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.7"
|
python-versions = "^3.7"
|
||||||
content-hash = "e772d54a2ce1e2f5acbc47a2316420dc652a4c745db08d44fd364222bbeae7ae"
|
content-hash = "33eaaf0e62340be5fa5c74233fd0760e61c9635cbad8f38d625f3c253fb9df4c"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "iredis"
|
name = "iredis"
|
||||||
version = "1.13.2"
|
version = "1.14.0"
|
||||||
description = "Terminal client for Redis with auto-completion and syntax highlighting."
|
description = "Terminal client for Redis with auto-completion and syntax highlighting."
|
||||||
authors = ["laixintao <laixintao1995@163.com>"]
|
authors = ["laixintao <laixintao1995@163.com>"]
|
||||||
readme = 'README.md'
|
readme = 'README.md'
|
||||||
|
@ -19,6 +19,8 @@ classifiers = [
|
||||||
"Programming Language :: Python :: 3.8",
|
"Programming Language :: Python :: 3.8",
|
||||||
"Programming Language :: Python :: 3.9",
|
"Programming Language :: Python :: 3.9",
|
||||||
"Programming Language :: Python :: 3.10",
|
"Programming Language :: Python :: 3.10",
|
||||||
|
"Programming Language :: Python :: 3.11",
|
||||||
|
# "Programming Language :: Python :: 3.12",
|
||||||
"Topic :: Database",
|
"Topic :: Database",
|
||||||
"License :: OSI Approved :: MIT License",
|
"License :: OSI Approved :: MIT License",
|
||||||
"Intended Audience :: Developers",
|
"Intended Audience :: Developers",
|
||||||
|
@ -26,7 +28,6 @@ classifiers = [
|
||||||
|
|
||||||
packages = [
|
packages = [
|
||||||
{ include = "iredis" },
|
{ include = "iredis" },
|
||||||
{ include = "tests", format = "sdist" },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
|
@ -35,12 +36,12 @@ prompt_toolkit = "^3"
|
||||||
Pygments = "^2"
|
Pygments = "^2"
|
||||||
mistune = "^3.0"
|
mistune = "^3.0"
|
||||||
configobj = "^5.0"
|
configobj = "^5.0"
|
||||||
click = "^7.0"
|
click = "^8.0"
|
||||||
pendulum = "^2.0"
|
pendulum = "^2.1.0"
|
||||||
# wcwidth 0.2.x uses pkg_resources which is not supported by PyOxidizer
|
# wcwidth 0.2.x uses pkg_resources which is not supported by PyOxidizer
|
||||||
wcwidth = "0.1.9"
|
wcwidth = "0.1.9"
|
||||||
packaging = "^21.3"
|
packaging = "^23.0"
|
||||||
redis = "^4.5.3"
|
redis = "^5.0.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = "^7.2"
|
pytest = "^7.2"
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
from textwrap import dedent
|
||||||
|
|
||||||
|
from packaging.version import parse as version_parse # noqa: F401
|
||||||
import pexpect
|
import pexpect
|
||||||
import pytest
|
import pytest
|
||||||
from textwrap import dedent
|
|
||||||
|
|
||||||
|
|
||||||
def test_start_on_connection_error():
|
def test_start_on_connection_error():
|
||||||
|
@ -29,14 +31,14 @@ def test_short_help_option(config):
|
||||||
c.close()
|
c.close()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) != 5")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) != version_parse('5')")
|
||||||
def test_server_version_in_starting_on5():
|
def test_server_version_in_starting_on5():
|
||||||
c = pexpect.spawn("iredis", timeout=2)
|
c = pexpect.spawn("iredis", timeout=2)
|
||||||
c.expect("redis-server 5")
|
c.expect("redis-server 5")
|
||||||
c.close()
|
c.close()
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) != 6")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) != version_parse('6')")
|
||||||
def test_server_version_in_starting_on6():
|
def test_server_version_in_starting_on6():
|
||||||
c = pexpect.spawn("iredis", timeout=2)
|
c = pexpect.spawn("iredis", timeout=2)
|
||||||
c.expect("redis-server 6")
|
c.expect("redis-server 6")
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from packaging.version import parse as version_parse
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,7 +11,7 @@ def test_wrong_select_db_index(cli):
|
||||||
cli.sendline("select 128")
|
cli.sendline("select 128")
|
||||||
cli.expect(["DB index is out of range", "127.0.0.1:6379[1]>"])
|
cli.expect(["DB index is out of range", "127.0.0.1:6379[1]>"])
|
||||||
|
|
||||||
if int(os.environ["REDIS_VERSION"]) > 5:
|
if version_parse(os.environ["REDIS_VERSION"]) > version_parse("5"):
|
||||||
text = "value is not an integer or out of range"
|
text = "value is not an integer or out of range"
|
||||||
else:
|
else:
|
||||||
text = "invalid DB index"
|
text = "invalid DB index"
|
||||||
|
@ -42,14 +44,14 @@ def test_enter_key_binding(clean_redis, cli):
|
||||||
cli.expect(r"hello")
|
cli.expect(r"hello")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) < 6")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) < version_parse('6')")
|
||||||
def test_auth_hidden_password_with_username(clean_redis, cli):
|
def test_auth_hidden_password_with_username(clean_redis, cli):
|
||||||
cli.send("auth default hello-world")
|
cli.send("auth default hello-world")
|
||||||
cli.expect("default")
|
cli.expect("default")
|
||||||
cli.expect(r"\*{11}")
|
cli.expect(r"\*{11}")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) > 5")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) > version_parse('5')")
|
||||||
def test_auth_hidden_password(clean_redis, cli):
|
def test_auth_hidden_password(clean_redis, cli):
|
||||||
cli.send("auth hello-world")
|
cli.send("auth hello-world")
|
||||||
cli.expect("auth")
|
cli.expect("auth")
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from packaging.version import parse as version_parse # noqa: F401
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,7 +38,7 @@ def test_command_completion_when_space_command(cli, clean_redis):
|
||||||
cli.expect("command info")
|
cli.expect("command info")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) < 6")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) < version_parse('6')")
|
||||||
def test_username_completer(cli, iredis_client):
|
def test_username_completer(cli, iredis_client):
|
||||||
iredis_client.execute("acl setuser", "foo1")
|
iredis_client.execute("acl setuser", "foo1")
|
||||||
iredis_client.execute("acl setuser", "bar2")
|
iredis_client.execute("acl setuser", "bar2")
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
# noqa: F541
|
# noqa: F541
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import pexpect
|
|
||||||
import pathlib
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
from textwrap import dedent
|
from textwrap import dedent
|
||||||
|
from packaging.version import parse as version_parse
|
||||||
|
|
||||||
|
import pexpect
|
||||||
|
|
||||||
|
|
||||||
TEST_IREDISRC = "/tmp/.iredisrc.test"
|
TEST_IREDISRC = "/tmp/.iredisrc.test"
|
||||||
|
@ -22,6 +24,10 @@ env_pager_numbers = "{0} {1} {2}".format(
|
||||||
TEST_PAGER_BOUNDARY_NUMBER,
|
TEST_PAGER_BOUNDARY_NUMBER,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
long_list_type = "quicklist"
|
||||||
|
if version_parse(os.environ["REDIS_VERSION"]) >= version_parse("7"):
|
||||||
|
long_list_type = "listpack"
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def pager_enabled_cli():
|
def pager_enabled_cli():
|
||||||
|
@ -54,11 +60,6 @@ def test_using_pager_works_for_help():
|
||||||
child.expect(TEST_PAGER_BOUNDARY)
|
child.expect(TEST_PAGER_BOUNDARY)
|
||||||
|
|
||||||
|
|
||||||
long_list_type = "quicklist"
|
|
||||||
if os.environ["REDIS_VERSION"] == "7":
|
|
||||||
long_list_type = "listpack"
|
|
||||||
|
|
||||||
|
|
||||||
def test_pager_works_for_peek(clean_redis):
|
def test_pager_works_for_peek(clean_redis):
|
||||||
for index in range(100):
|
for index in range(100):
|
||||||
clean_redis.lpush("long-list", f"value-{index}")
|
clean_redis.lpush("long-list", f"value-{index}")
|
||||||
|
|
|
@ -105,7 +105,7 @@ def cli():
|
||||||
|
|
||||||
child = pexpect.spawn(f"iredis -n 15 --iredisrc {f.name}", timeout=TIMEOUT, env=env)
|
child = pexpect.spawn(f"iredis -n 15 --iredisrc {f.name}", timeout=TIMEOUT, env=env)
|
||||||
child.logfile_read = open("cli_test.log", "ab")
|
child.logfile_read = open("cli_test.log", "ab")
|
||||||
child.expect(["https://iredis.io/issues", "127.0.0.1"])
|
child.expect(["https://github.com/laixintao/iredis/issues", "127.0.0.1"])
|
||||||
yield child
|
yield child
|
||||||
child.close()
|
child.close()
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ def raw_cli():
|
||||||
f"iredis --raw -n 15 --iredisrc {TEST_IREDISRC}", timeout=TIMEOUT
|
f"iredis --raw -n 15 --iredisrc {TEST_IREDISRC}", timeout=TIMEOUT
|
||||||
)
|
)
|
||||||
child.logfile_read = open("cli_test.log", "ab")
|
child.logfile_read = open("cli_test.log", "ab")
|
||||||
child.expect(["https://iredis.io/issues", "127.0.0.1"])
|
child.expect(["https://github.com/laixintao/iredis/issues", "127.0.0.1"])
|
||||||
yield child
|
yield child
|
||||||
child.close()
|
child.close()
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
from textwrap import dedent
|
||||||
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
|
from packaging.version import parse as version_parse
|
||||||
|
from prompt_toolkit.formatted_text import FormattedText
|
||||||
import pytest
|
import pytest
|
||||||
import redis
|
import redis
|
||||||
from unittest.mock import MagicMock, patch
|
|
||||||
from textwrap import dedent
|
|
||||||
|
|
||||||
from prompt_toolkit.formatted_text import FormattedText
|
|
||||||
|
|
||||||
from iredis.client import Client
|
from iredis.client import Client
|
||||||
from iredis.config import config, load_config_files
|
from iredis.commands import command2syntax
|
||||||
from iredis.completers import IRedisCompleter
|
from iredis.completers import IRedisCompleter
|
||||||
|
from iredis.config import config, load_config_files
|
||||||
from iredis.entry import Rainbow, prompt_message
|
from iredis.entry import Rainbow, prompt_message
|
||||||
from iredis.exceptions import NotSupport
|
from iredis.exceptions import NotSupport
|
||||||
from iredis.commands import command2syntax
|
|
||||||
from ..helpers import formatted_text_rematch
|
from ..helpers import formatted_text_rematch
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,7 +26,7 @@ def completer():
|
||||||
zset_type = "ziplist"
|
zset_type = "ziplist"
|
||||||
hash_type = "hashtable"
|
hash_type = "hashtable"
|
||||||
list_type = "quicklist"
|
list_type = "quicklist"
|
||||||
if os.environ["REDIS_VERSION"] == "7":
|
if version_parse(os.environ["REDIS_VERSION"]) >= version_parse("7"):
|
||||||
zset_type = "listpack"
|
zset_type = "listpack"
|
||||||
hash_type = "listpack"
|
hash_type = "listpack"
|
||||||
list_type = "listpack"
|
list_type = "listpack"
|
||||||
|
@ -40,7 +42,7 @@ if os.environ["REDIS_VERSION"] == "7":
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_send_command(_input, command_name, expect_args):
|
def test_send_command(_input, command_name, expect_args):
|
||||||
client = Client("127.0.0.1", "6379", None)
|
client = Client("127.0.0.1", 6379, None)
|
||||||
client.execute = MagicMock()
|
client.execute = MagicMock()
|
||||||
next(client.send_command(_input, None))
|
next(client.send_command(_input, None))
|
||||||
args, _ = client.execute.call_args
|
args, _ = client.execute.call_args
|
||||||
|
@ -180,7 +182,7 @@ def test_not_retry_on_authentication_error(iredis_client, config):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(
|
@pytest.mark.skipif(
|
||||||
"int(os.environ['REDIS_VERSION']) != 6",
|
"version_parse(os.environ['REDIS_VERSION']) != version_parse('6')",
|
||||||
reason="""
|
reason="""
|
||||||
in redis7, it will not work if you:
|
in redis7, it will not work if you:
|
||||||
1. connect redis without password
|
1. connect redis without password
|
||||||
|
@ -213,7 +215,7 @@ def test_auto_select_db_and_auth_for_reconnect_only_6(iredis_client, config):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif("int(os.environ['REDIS_VERSION']) > 5")
|
@pytest.mark.skipif("version_parse(os.environ['REDIS_VERSION']) > version_parse('5')")
|
||||||
def test_auto_select_db_and_auth_for_reconnect_only_5(iredis_client, config):
|
def test_auto_select_db_and_auth_for_reconnect_only_5(iredis_client, config):
|
||||||
config.retry_times = 2
|
config.retry_times = 2
|
||||||
config.raw = True
|
config.raw = True
|
||||||
|
@ -553,24 +555,30 @@ def test_version_parse_for_auth(iredis_client):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"info, version",
|
"info, version",
|
||||||
[
|
[
|
||||||
|
(
|
||||||
(
|
(
|
||||||
"# Server\r\nredis_version:df--128-NOTFOUND\r\n"
|
"# Server\r\nredis_version:df--128-NOTFOUND\r\n"
|
||||||
"redis_mode:standalone\r\narch_bits:64",
|
"redis_mode:standalone\r\narch_bits:64"
|
||||||
|
),
|
||||||
"df--128-NOTFOUND",
|
"df--128-NOTFOUND",
|
||||||
),
|
),
|
||||||
|
(
|
||||||
(
|
(
|
||||||
"# Server\r\nredis_version:6.2.5\r\n"
|
"# Server\r\nredis_version:6.2.5\r\n"
|
||||||
"redis_git_sha1:00000000\r\n"
|
"redis_git_sha1:00000000\r\n"
|
||||||
"redis_git_dirty:0\r\n"
|
"redis_git_dirty:0\r\n"
|
||||||
"redis_build_id:915e5480613bc9b6\r\n"
|
"redis_build_id:915e5480613bc9b6\r\n"
|
||||||
"redis_mode:standalone ",
|
"redis_mode:standalone "
|
||||||
|
),
|
||||||
"6.2.5",
|
"6.2.5",
|
||||||
),
|
),
|
||||||
|
(
|
||||||
(
|
(
|
||||||
"# Server\r\nredis_version:5.0.14.1\r\n"
|
"# Server\r\nredis_version:5.0.14.1\r\n"
|
||||||
"redis_git_sha1:00000000\r\nredis_git_dirty:0\r\n"
|
"redis_git_sha1:00000000\r\nredis_git_dirty:0\r\n"
|
||||||
"redis_build_id:915e5480613bc9b6\r\n"
|
"redis_build_id:915e5480613bc9b6\r\n"
|
||||||
"redis_mode:standalone ",
|
"redis_mode:standalone "
|
||||||
|
),
|
||||||
"5.0.14.1",
|
"5.0.14.1",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -580,9 +588,10 @@ def test_version_path(info, version):
|
||||||
mock_config.no_info = True
|
mock_config.no_info = True
|
||||||
mock_config.pager = "less"
|
mock_config.pager = "less"
|
||||||
mock_config.version = "5.0.0"
|
mock_config.version = "5.0.0"
|
||||||
|
mock_config.decode = "utf-8"
|
||||||
with patch("iredis.client.Client.execute") as mock_execute:
|
with patch("iredis.client.Client.execute") as mock_execute:
|
||||||
mock_execute.return_value = info
|
mock_execute.return_value = info
|
||||||
client = Client("127.0.0.1", "6379", None)
|
client = Client("127.0.0.1", 6379)
|
||||||
client.get_server_info()
|
client.get_server_info()
|
||||||
assert mock_config.version == version
|
assert mock_config.version == version
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue