Interactive Redis: A Terminal Client for Redis with AutoCompletion and Syntax Highlighting.

Overview

Interactive Redis: A Cli for Redis with AutoCompletion and Syntax Highlighting.

Github Action PyPI version Python version Download stats Chat on telegram Open in Cloud Shell

demo

IRedis is a terminal client for redis with auto-completion and syntax highlighting. IRedis lets you type Redis commands smoothly, and displays results in a user-friendly format.

IRedis is an alternative for redis-cli. In most cases, IRedis behaves exactly the same as redis-cli. Besides, it is safer to use IRedis on production servers than redis-cli: IRedis will prevent accidentally running dangerous commands, like KEYS * (see Redis docs / Latency generated by slow commands).

Features

  • Advanced code completion. If you run command KEYS then run DEL, IRedis will auto-complete your command based on KEYS result.
  • Command validation. IRedis will validate command while you are typing, and highlight errors. E.g. try CLUSTER MEET IP PORT, IRedis will validate IP and PORT for you.
  • Command highlighting, fully based on redis grammar. Any valid command in IRedis shell is a valid redis command.
  • Human-friendly result display.
  • pipeline feature, you can use your favorite shell tools to parse redis' response, like get json | jq ..
  • Support pager for long output.
  • Support connection via URL, iredis --url redis://example.com:6379/1.
  • Store server configuration: iredis -d prod-redis (see dsn for more).
  • peek command to check the key's type then automatically call get/lrange/sscan, etc, depending on types. You don't need to call the type command then type another command to get the value. peek will also display the key's length and memory usage.
  • Ctrl + C to cancel the current typed command, this won't exit IRedis, exactly like bash behaviour. Use Ctrl + D to send a EOF to exit IRedis.
  • Ctrl + R to open reverse-i-search to search through your command history.
  • Auto suggestions. (Like fish shell.)
  • Support --encode=utf-8, to decode Redis' bytes responses.
  • Command hint on bottom, include command syntax, supported redis version, and time complexity.
  • Official docs with built-in HELP command, try HELP SET!
  • Written in pure Python, but IRedis was packaged into a single binary with PyOxidizer, you can use cURL to download and run, it just works, even you don't have a Python interpreter.
  • Hide password for AUTH command.
  • Says "Goodbye!" to you when you exit!
  • For full features, please see: iredis.io

Install

Install via pip:

pip install iredis

pipx is recommended:

pipx install iredis

Or you can download the executable binary with cURL(or wget), untar, then run. It is especially useful when you don't have a python interpreter(E.g. the official Redis docker image which doesn't have Python installed.):

wget  https://github.com/laixintao/iredis/releases/latest/download/iredis.tar.gz \
 && tar -xzf iredis.tar.gz \
 && ./iredis

(Check the release page if you want to download an old version of IRedis.)

Usage

Once you install IRedis, you will know how to use it. Just remember, IRedis supports similar options like redis-cli, like -h for redis-server's host and -p for port.

$ iredis --help

Using DSN

IRedis support storing server configuration in config file. Here is a DSN config:

[alias_dsn]
dev=redis://localhost:6379/4
staging=redis://username:[email protected]:6379/1

Put this in your iredisrc then connect via iredis -d staging or iredis -d dev.

Configuration

IRedis supports config files. Command-line options will always take precedence over config. Configuration resolution from highest to lowest precedence is:

  • Options from command line
  • $PWD/.iredisrc
  • ~/.iredisrc (this path can be changed with iredis --iredisrc $YOUR_PATH)
  • /etc/iredisrc
  • default config in IRedis package.

You can copy the self-explained default config here:

https://raw.githubusercontent.com/laixintao/iredis/master/iredis/data/iredisrc

And then make your own changes.

(If you are using an old versions of IRedis, please use the config file below, and change the version in URL):

https://raw.githubusercontent.com/laixintao/iredis/v1.0.4/iredis/data/iredisrc

Keys

IRedis support unix/readline-style REPL keyboard shortcuts, which means keys like Ctrl + F to forward work.

Also:

  • Ctrl + F (i.e. EOF) to exit; you can also use the exit command.
  • Ctrl + L to clear screen; you can also use the clear command.
  • Ctrl + X Ctrl + E to open an editor to edit command, or V in vi-mode.

Development

Release Strategy

IRedis is built and released by GitHub Actions. Whenever a tag is pushed to the master branch, a new release is built and uploaded to pypi.org, it's very convenient.

Thus, we release as often as possible, so that users can always enjoy the new features and bugfixes quickly. Any bugfix or new feature will get at least a patch release, whereas big features will get a minor release.

Setup Environment

IRedis favors poetry as package management tool. To setup a develop environment on your computer:

First, install poetry (you can do it in a python's virtualenv):

pip install poetry

Then run (which is similar to pip install -e .):

poetry install

Be careful running testcases locally, it may flush you db!!!

Development Logs

This is a command-line tool, so we don't write logs to stdout.

You can tail -f ~/.iredis.log to see logs, the log is pretty clear, you can see what actually happens from log files.

Catch Up with Latest Redis-doc

IRedis use a git submodule to track current-up-to-date redis-doc version. To catch up with latest:

  1. Git pull in redis-doc
  2. Copy doc files to /data: cp -r redis-doc/commands* iredis/data
  3. Prettier markdownprettier --prose-wrap always iredis/data/commands/*.md --write
  4. Check the diff, update IRedis' code if needed.

Related Projects

If you like iredis, you may also like other cli tools by dbcli:

  • pgcli - Postgres Client with Auto-completion and Syntax Highlighting
  • mycli - MySQL/MariaDB/Percona Client with Auto-completion and Syntax Highlighting
  • litecli - SQLite Client with Auto-completion and Syntax Highlighting
  • mssql-cli - Microsoft SQL Server Client with Auto-completion and Syntax Highlighting
  • athenacli - AWS Athena Client with Auto-completion and Syntax Highlighting
  • vcli - VerticaDB client
  • iredis - Client for Redis with AutoCompletion and Syntax Highlighting

IRedis is build on the top of prompt_toolkit, a Python library (by Jonathan Slenders) for building rich commandline applications.

Comments
  • Add an option to change default cli prompt

    Add an option to change default cli prompt

    See the discussion here:

    http://redisdoc.com/transaction/exec.html#comment-4588712198

    https://stackoverflow.com/questions/52690515/change-redis-command-prompt-text/52691005

    opened by laixintao 12
  • rprompt for redis exec

    rprompt for redis exec

    Then the user will know he is in a transection.

    • [x] Display transaction state with rprompt;
    • [ ] Render EXEC response with original command, not just command result.
    • [x] Set transaction back to False on proper time. (see here)
    • [x] All command needs to render QUEUE in transation state.
    • [ ] testcases...
    • [ ] bugfix: abort transaction on Exception.
    opened by laixintao 10
  • feat: add support for configuring TLS verification policy

    feat: add support for configuring TLS verification policy

    Hi! Thanks for this very nice piece of software. First of all, I would like to compliment you for the high quality python code in this repo. It is refreshing to read it.

    I am opening this PR to add support for explicit configuration of the ssl_cert_reqs parameter, in case the connection schema is rediss. I took the liberty to also update the README with an updated iredis --help.

    To pass values to the underlying SSLConnection object, the user has now two choices:

    • specify the value of ssl_cert_reqs as a query parameter in the url specified via --url
    • specify such value using the --verify-ssl option

    Both check that the value be among none, optional or required, and the former takes precedence over the latter (same behavior as the db parameter).

    This should tackle issue 403.

    opened by torrefatto 8
  • Support stream.

    Support stream.

    todo:

    • [ ] special render for stream, nested list is hard to read.
    • [x] id completer.

    doc:

    • https://redis.io/topics/streams-intro
    • https://redis.io/commands/xread

    close #249 related #246

    close-now-check-later 
    opened by laixintao 8
  • TypeError occurs when answering yes/no question

    TypeError occurs when answering yes/no question

    iredis  1.4.3 (Python 3.6.8)
    redis-server  3.2.8
    Home:   https://iredis.io
    Issues: https://iredis.io/issues
    (IP) > keys *
    KEYS will hang redis server, use SCAN instead.
    Do you want to proceed? (y/n): n
    a bytes-like object is required, not 'FormattedText'
    Traceback (most recent call last):
      File "/root/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/entry.py", line 177, in repl
        write_result(answer)
      File "/root/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/entry.py", line 88, in write_result
        sys.stdout.buffer.write(text)
    TypeError: a bytes-like object is required, not 'FormattedText'
    (error) a bytes-like object is required, not 'FormattedText'
    
    opened by frostming 7
  • (WIP) Enable pyoxidizer builds

    (WIP) Enable pyoxidizer builds

    This is a work-in-progress PR to use PyOxidizer to compile iredis into a single binary. Issue: https://github.com/laixintao/iredis/issues/218 Work-in-progress because:

    1. PyOxidizer does not set the __file__ attribute in modules: https://pyoxidizer.readthedocs.io/en/latest/packaging_pitfalls.html#reliance-on-file, which is needed here: https://github.com/laixintao/iredis/blob/v1.0.0/iredis/init.py#L8
    2. We must determine where to upload the binary

    Motivation Users who run redis inside containers (which rarely come with python interpreters) may want to use iredis for live-debugging. Those users could simply use curl to download the binary version of iredis

    opened by mac-chaffee 7
  • Compile grammer regex too slow.

    Compile grammer regex too slow.

    DEBUG [grammar compile time] 0.6472580432891846
    DEBUG [timer] Grammer created: 9.5367431640625e-07 from start.
     INFO iredis start, host=127.0.0.1, port=6379, db=0.
    DEBUG Using selector: KqueueSelector
    DEBUG [timer] First REPL: 0.04548501968383789 from start.
    DEBUG REPL waiting for command...
    

    Takes 0.64secnds to compile when startup, painful slow.

    help wanted 
    opened by laixintao 7
  • TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'

    TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'

    iredis version: 1.12.0 OS: Linux version 5.19.4-arch1-1 ([email protected]) (gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.39.0) #1 SMP PREEMPT_DYNAMIC Thu, 25 Aug 2022 17:31:12 +0000

    iredis --url 'redis://my_ip:6379/2'
    Traceback (most recent call last):
      File "/usr/bin/iredis", line 33, in <module>
        sys.exit(load_entry_point('iredis==1.12.0', 'console_scripts', 'iredis')())
      File "/usr/lib/python3.10/site-packages/iredis/entry.py", line 426, in main
        client = create_client(ctx.params)
      File "/usr/lib/python3.10/site-packages/iredis/entry.py", line 384, in create_client
        return Client(
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 77, in __init__
        self.build_connection()
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 103, in build_connection
        self.connection = self.create_connection(
      File "/usr/lib/python3.10/site-packages/iredis/client.py", line 156, in create_connection
        return connection_class(**connection_kwargs)
    TypeError: Connection.__init__() got an unexpected keyword argument 'client_name'                                                                  /0.2s
    
    opened by Karmenzind 5
  • Create Conda recipe

    Create Conda recipe

    Hello @laixintao,

    Not really an issue, but I have created a Conda recipe for this CLI. See: https://github.com/conda-forge/staged-recipes/pull/19991.

    Do you give your permission to be marked as a maintainer for this recipe?

    opened by aymericbeaumet 5
  • bugfix: --url option is not working

    bugfix: --url option is not working

    Thanks for the great product! I've been using it every day lately!

    I've found a bug that doesn't work when you specify DSN using --url option. In order to use SSL/TLS communication I need to use rediss:// , so not working dsn is a serious problem for me.

    Currently, it ignores --url option and connects to the default redis location as shown below

    $ iredis --version
    iredis, version 1.6.2
    
    # redis is working at 127.0.0.1: 6379 and my.redis.local:16379
    $ iredis -h 127.0.0.1 -p 6379 -n 0
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.8
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    127.0.0.1:6379[0]>
    Goodbye!
    
    $ iredis -h my.redis.local -p 16379 -n 0
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.7
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    my.redis.local:16379[0]>
    Goodbye!
    
    # --url option is ignored and connected to the default redis location
    $ iredis --url 'redis://my.redis.local:16379/0'
    iredis 1.6.2 (Python 3.7.5)
    redis-server 5.0.8
    Home: https://iredis.io
    Issues: https://iredis.io/issues
    127.0.0.1:6379>    # <------- CONNECTED TO 127.0.0.1:6379
    Goodbye!
    

    Fixed an unintentional overwriting of the client variable created by the --url option.

    This fix caused the test to fail due to side effects from the environment variables IREDIS_URL. The updating os.environ affects all tests in pytest.Use pytest's monkeypatch.setenv so that the environment value is updated only by the scope of the function. https://docs.pytest.org/en/latest/monkeypatch.html#monkeypatching-environment-variables

    The test that specified the unix socket in dns was also failing. At least the socket path in GithubActions didn't seem to be /tmp/redis/redis.sock and it was failing the test. It's hard to pinpoint the path in various environments, so I changed this test to skip if unix socket is not found.

    Thank you!

    opened by otms61 5
  • "ERROR 'NoneType' object is not iterable" on failed transaction

    When a transaction fails, iredis doesn't properly handle the result of the EXEC command (null reply)

    localhost:6379> watch foo
    OK
    localhost:6379> multi
    OK
    localhost:6379> get bar                                          <transaction>
    QUEUED
    localhost:6379> exec                                             <transaction>
    (error) ERROR 'NoneType' object is not iterable
    

    Contents of the log:

     INFO [Command] exec
     INFO [Prepare command] Redis: exec, Shell: None
     INFO [Split command] command: exec, args: []
    DEBUG [After hook] Command is exec, unset transaction.
     INFO [Redis-Server] Response: None
     INFO [render] Find callback render_list, for command: exec
    ERROR 'NoneType' object is not iterable
    Traceback (most recent call last):
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/client.py", line 304, in send_command
        yield self.render_response(redis_resp, command_name)
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/client.py", line 199, in render_response
        rendered = callback(response)
      File "/home/brian/.local/pipx/venvs/iredis/lib/python3.6/site-packages/iredis/renders.py", line 125, in render_list
        for item in text:
    TypeError: 'NoneType' object is not iterable
     INFO Print result prompt_toolkit.formatted_text.base.FormattedText: FormattedText([('class:type', '(error) '), ('class:error', "ERROR 'NoneType' object is not iterable")])
    

    environment details:

    • iredis version 1.6.2
    • python 3.6.9
    • ubuntu 18.04
    • redis version 4.0.9
    opened by brianmaissy 5
  • support tls

    support tls

    redis tls: https://redis.io/docs/manual/security/encryption/

    try to keep the same args with redis-cli:

    ./src/redis-cli --tls \
        --cert ./tests/tls/redis.crt \
        --key ./tests/tls/redis.key \
        --cacert ./tests/tls/ca.crt
    
    • [ ] add test case for https://github.com/laixintao/iredis/pull/442
    • [ ] setup tests service in github action
    • [ ] test tls connection
    • [ ] test dsn tls connection
    opened by laixintao 0
  • xread with a stream returning nil instead throws ERROR

    xread with a stream returning nil instead throws ERROR

    It is very easy to reproduce:

    127.0.0.1:6379> xread STREAMS mystream $
    (error) ERROR 'NoneType' object is not iterable
    

    In redis-cli, I get (nil) returned

    opened by hodapp512 1
  • I hope you can upgrade the iredis dependency click version to 8

    I hope you can upgrade the iredis dependency click version to 8

    But when I tried to install iredis, I found a conflict between flask and the version of click on which iredis depends

    pip install iredis

    error info 👇

    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    flask 2.1.2 requires click>=8.0, but you have click 7.1.2 which is incompatible.
    

    flask version info 👇

    ─➤  pip show flask    
    Name: Flask
    Version: 2.1.2
    Summary: A simple framework for building complex web applications.
    Home-page: https://palletsprojects.com/p/flask
    Author: Armin Ronacher
    Author-email: [email protected]
    License: BSD-3-Clause
    Location: /Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages
    Requires: click, itsdangerous, Jinja2, Werkzeug
    Required-by: 
    
    opened by ponponon 4
  • Test fails on i586

    Test fails on i586

    I'm packaging iredis on openSUSE and I see test failures on i586 while x64_86, aarch64 and ppc64 work fine:

    [   90s] =================================== FAILURES ===================================
    [   90s] ___________________________ test_peek_set_fetch_part ___________________________
    [   90s] 
    [   90s] iredis_client = <iredis.client.Client object at 0xf605ea60>
    [   90s] clean_redis = Redis<ConnectionPool<Connection<host=localhost,port=6379,db=15>>>
    [   90s] 
    [   90s]     def test_peek_set_fetch_part(iredis_client, clean_redis):
    [   90s]         clean_redis.sadd("myset", *[f"hello-{index}" for index in range(40)])
    [   90s]         peek_result = list(iredis_client.do_peek("myset"))
    [   90s]     
    [   90s]         assert peek_result[0][0] == ("class:dockey", "key: ")
    [   90s] >       assert peek_result[0][1][1].startswith("set (hashtable)  mem: 2")
    [   90s] E       AssertionError: assert False
    [   90s] E        +  where False = <built-in method startswith of str object at 0xf60d5920>('set (hashtable)  mem: 2')
    [   90s] E        +    where <built-in method startswith of str object at 0xf60d5920> = 'set (hashtable)  mem: 1748 bytes, ttl: -1'.startswith
    [   90s] 
    [   90s] tests/unittests/test_client.py:331: AssertionError
    [   90s] _______________________________ test_peek_stream _______________________________
    [   90s] 
    [   90s] iredis_client = <iredis.client.Client object at 0xf60bf430>
    [   90s] clean_redis = Redis<ConnectionPool<Connection<host=localhost,port=6379,db=15>>>
    [   90s] 
    [   90s]     def test_peek_stream(iredis_client, clean_redis):
    [   90s]         clean_redis.xadd("mystream", {"foo": "bar", "hello": "world"})
    [   90s]         peek_result = list(iredis_client.do_peek("mystream"))
    [   90s]     
    [   90s]         assert peek_result[0][0] == ("class:dockey", "key: ")
    [   90s] >       assert re.match(
    [   90s]             r"stream \((stream|unknown)\)  mem: 6\d\d bytes, ttl: -1", peek_result[0][1][1]
    [   90s]         )
    [   90s] E       AssertionError: assert None
    [   90s] E        +  where None = <function match at 0xf77ef4a8>('stream \\((stream|unknown)\\)  mem: 6\\d\\d bytes, ttl: -1', 'stream (stream)  mem: 387 bytes, ttl: -1')
    [   90s] E        +    where <function match at 0xf77ef4a8> = re.match
    [   90s] 
    [   90s] tests/unittests/test_client.py:403: AssertionError
    [   90s] ______________ test_timestamp_completer_humanize_time_completion _______________
    [   90s] 
    [   90s] fake_now = <MagicMock name='now' id='4129102000'>
    [   90s] 
    [   90s]     @patch("iredis.completers.pendulum.now")
    [   90s]     def test_timestamp_completer_humanize_time_completion(fake_now):
    [   90s]         fake_now.return_value = pendulum.from_timestamp(1578487013)
    [   90s]         c = TimestampCompleter()
    [   90s]     
    [   90s]         fake_document = MagicMock()
    [   90s]         fake_document.text = fake_document.text_before_cursor = "30"
    [   90s]         completions = list(c.get_completions(fake_document, None))
    [   90s]     
    [   90s]         assert completions == [
    [   90s]             Completion(
    [   90s]                 text="1575895013000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1575895013000")]),
    [   90s]                 display_meta="30 days ago (2019-12-09 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578379013000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578379013000")]),
    [   90s]                 display_meta="30 hours ago (2020-01-07 06:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578485213000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578485213000")]),
    [   90s]                 display_meta="30 minutes ago (2020-01-08 12:06:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578486983000",
    [   90s]                 start_position=-2,
    [   90s]                 display=FormattedText([("", "1578486983000")]),
    [   90s]                 display_meta="30 seconds ago (2020-01-08 12:36:23)",
    [   90s]             ),
    [   90s]         ]
    [   90s]     
    [   90s]         # No plural
    [   90s]         fake_document.text = fake_document.text_before_cursor = "1"
    [   90s]         completions = list(c.get_completions(fake_document, None))
    [   90s]     
    [   90s] >       assert completions == [
    [   90s]             Completion(
    [   90s]                 text="1546951013000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1546951013000")]),
    [   90s]                 display_meta="1 year ago (2019-01-08 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1575808613000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1575808613000")]),
    [   90s]                 display_meta="1 month ago (2019-12-08 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578400613000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578400613000")]),
    [   90s]                 display_meta="1 day ago (2020-01-07 12:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578483413000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578483413000")]),
    [   90s]                 display_meta="1 hour ago (2020-01-08 11:36:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578486953000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578486953000")]),
    [   90s]                 display_meta="1 minute ago (2020-01-08 12:35:53)",
    [   90s]             ),
    [   90s]             Completion(
    [   90s]                 text="1578487012000",
    [   90s]                 start_position=-1,
    [   90s]                 display=FormattedText([("", "1578487012000")]),
    [   90s]                 display_meta="1 second ago (2020-01-08 12:36:52)",
    [   90s]             ),
    [   90s]         ]
    [   90s] E       AssertionError: assert [Completion(t...000')])), ...] == [Completion(t...87012000')]))]
    [   90s] E         Left contains one more item: Completion(text='1643072400000', start_position=-1, display=FormattedText([('', '1643072400000')]))
    [   90s] E         Full diff:
    [   90s] E           [
    [   90s] E            Completion(text='1546951013000', start_position=-1, display=FormattedText([('', '1546951013000')])),
    [   90s] E            Completion(text='1575808613000', start_position=-1, display=FormattedText([('', '1575808613000')])),
    [   90s] E            Completion(text='1578400613000', start_position=-1, display=FormattedText([('', '1578400613000')])),
    [   90s] E            Completion(text='1578483413000', start_position=-1, display=FormattedText([('', '1578483413000')])),...
    [   90s] E         
    [   90s] E         ...Full output truncated (5 lines hidden), use '-vv' to show
    [   90s] 
    [   90s] tests/unittests/test_completers.py:223: AssertionError
    

    Do you know what might cause this?

    opened by sebix 7
Releases(v1.13.0)
Owner
I love system administration as much as I love programming.
EODAG is a command line tool and a plugin-oriented Python framework for searching, aggregating results and downloading remote sensed images while offering a unified API for data access regardless of the data provider

EODAG (Earth Observation Data Access Gateway) is a command line tool and a plugin-oriented Python framework for searching, aggregating results and downloading remote sensed images while offering a un

CS GROUP 205 Jan 03, 2023
Wordle for CLUE - WORDLE clone for Adafruit Clue

Wordle_for_CLUE This project is a clone of the very popular word solving puzzle

Michael Lacock 4 Feb 15, 2022
dcargs is a tool for generating portable, reusable, and strongly typed CLI interfaces from dataclass definitions.

dcargs is a tool for generating portable, reusable, and strongly typed CLI interfaces from dataclass definitions.

Brent Yi 119 Jan 09, 2023
A CLI tool for searching and watching videos on youtube with no spyware and MPV and yt-dlp

A CLI tool for searching and watching videos on youtube with no spyware and MPV and yt-dlp

TruncatedDinosour 3 Feb 22, 2022
A simple CLI based any Download Tool, that find files and let you stream or download thorugh WebTorrent CLI or Aria or any command tool

Privateer A simple CLI based any Download Tool, that find files and let you stream or download thorugh WebTorrent CLI or Aria or any command tool How

Shreyash Chavan 2 Apr 04, 2022
CLI tool to develop StarkNet projects written in Cairo

⛵ Nile Navigate your StarkNet projects written in Cairo. Installation pip install cairo-nile Usage Install Cairo Use nile to install a given version o

MartĂ­n Triay 305 Dec 30, 2022
Simple command-line implementation of minesweeper

minesweeper This is a Python implementation of 2-D Minesweeper! Check out the tutorial here: https://youtu.be/Fjw7Lc9zlyU You start a game by running

Kylie 49 Dec 10, 2022
Module for converting 2D Python lists to fancy ASCII tables. Table2Ascii lets you display pretty tables in the terminal and on Discord.

table2ascii Module for converting 2D Python lists to a fancy ASCII/Unicode tables table2ascii 📥 Installation 🧑‍💻 Usage Convert lists to ASCII table

Jonah Lawrence 40 Jan 03, 2023
Just a shell writed on Python

HIGHSHELL (also hSH or HS) Just a shell writed on Python Send bug report • How to use the shell • Broked features • Licenses How to use the shell Inst

0LungSkill0 2 Jan 04, 2022
A **CLI** folder organizer written in Python.

Fsorter Introduction A CLI folder organizer written in Python. Dependencies Before installing, install the following dependencies: Ubuntu/Debain Based

1 Nov 17, 2021
Quickly open any path on your terminal window in your $EDITOR of choice!

Tmux fpp Plugin wrapper around Facebook PathPicker. Quickly open any path on your terminal window in your $EDITOR of choice! Demo Dependencies fpp - F

257 Dec 28, 2022
A simple CLI tool for getting region-specific status of Logz.io components.

About A simple CLI tool for checking the current status of Logz.io components per region. Built With Python 3 The following packeges (see requirements

Yotam Bernaz 1 Dec 11, 2021
Chameleon is yet another PowerShell obfuscation tool designed to bypass AMSI and commercial antivirus solutions.

Chameleon is yet another PowerShell obfuscation tool designed to bypass AMSI and commercial antivirus solutions. The tool has been developed as a Python port of the Chimera project, by tokioneon_.

332 Dec 26, 2022
Python3 parser for Apple's crash reports

pyCrashReport in intended for analyzing crash reports from Apple devices into a clearer view, without all the thread listing and loaded images, just the actual data you really need to debug the probl

7 Aug 19, 2022
Modern line-oriented terminal emulator without support for TUIs.

Modern line-oriented terminal emulator without support for TUIs.

10 Jun 12, 2022
Customisable pharmacokinetic model accessible via bash CLI allowing for variable dose calculations as well as intravenous and subcutaneous administration calculations

Pharmacokinetic Modelling Group Project A PharmacoKinetic (PK) modelling function for analysis of injected solute dynamics over time, developed by Gro

1 Oct 24, 2021
A simple terminal-based localhost chat application written in python

Chat House A simple terminal-based localhost chat application written in python How to Use? Clone the repo git clone https://github.com/heksadecimal/c

Heks 10 Nov 09, 2021
Oil is a new Unix shell. It's our upgrade path from bash to a better language and runtime

Oil is a new Unix shell. It's our upgrade path from bash to a better language and runtime. It's also for Python and JavaScript users who avoid shell!

2.4k Jan 08, 2023
Format click help output nicely with rich.

rich-click Format click help output nicely with Rich. Click is a "Python package for creating beautiful command line interfaces". Rich is a "Python li

Phil Ewels 333 Jan 02, 2023
A webmining CLI tool & library for python.

minet is a webmining command line tool & library for python (= 3.6) that can be used to collect and extract data from a large variety of web sources

médialab Sciences Po 165 Dec 17, 2022