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.
A command line tool to publish ads on ebay-kleinanzeigen.de

kleinanzeigen-bot Feedback and high-quality pull requests are highly welcome! About Installation Usage Development Notes License About kleinanzeigen-b

83 Dec 26, 2022
Euporie is a text-based user interface for running and editing Jupyter notebooks

Euporie is a text-based user interface for running and editing Jupyter notebooks

781 Jan 01, 2023
Python CLI for accessing CSCI320 PDM Database

p320_14 Python CLI for accessing CSCI320 PDM Database Authors: Aidan Mellin Dan Skigen Jacob Auger Kyle Baptiste Before running the application for th

Aidan Mellin 1 Nov 23, 2021
A simple Python library that allows you to customize your CLI based output on Linux

Terminal-Colored-Print About A small module that allows to simply decorate strings on Linux terminals. I personally use it for multi-threaded project,

Francesco Milano 0 Dec 13, 2021
Bryce Geiser 4 Aug 04, 2022
A small system that allow you to manage hosts stored in your .ssh/config file

A small system that allow you to manage hosts stored in your .ssh/config using simple commands.

Simone Ostini 1 Jan 24, 2022
Pequeno joguinho pra você rodar no seu terminal

JokenPython Pequeno joguinho pra você rodar no seu terminal Olá! Joguinho legal pra vc rodar no seu terminal!! (rode no terminal, pra melhor experienc

Scott 4 Nov 25, 2021
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
A Tempmail Tool for Terminal and Termux.

A Tempmail Tool for Terminal and Termux.

MAO-COMMUNITY 8 Oct 19, 2022
Wordle helper: help you print posible 5-character words based on you input

Wordle Helper This program help you print posible 5-character words based on you

Gwan Thanakrit Juthamongkhon 4 Jan 19, 2022
Dart Version Manager CLI implemented with Python and Typer.

Dart Version Manager CLI implemented with Python and Typer.

EducUp 6 Jun 26, 2022
A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

Kyle Harrison 150 Dec 14, 2022
Container images for portable development environments

Docker Dev Spin up a container to develop from anywhere! To run, just: docker run -ti aghost7/nodejs-dev:boron tmux new Alternatively, if on Linux: p

Jonathan Boudreau 163 Dec 22, 2022
inklayers is a command line program that exports layers from an SVG file.

inklayers is a command line program that exports layers from an SVG file. It can be used to create slide shows by editing a single SVG file.

11 Mar 29, 2022
Gitfetch is a simple tool to get github user details

Gitfetch Just a (cli?) tool to get github user details 🙂 Installation 📂 Install Gitfetch via pypi pip install gitfetch or pip install git+https://g

I'm Not A Bot #Left_TG 7 Jan 23, 2022
A python script that enables a raspberry pi sd card through the CLI and automates the process of configuring network details and ssh.

This project is one script (wpa_helper.py) written in python that will allow for the user to automate the proccess of setting up a new boot disk and configuring ssh and network settings for the pi

Theo Kirby 6 Jun 24, 2021
A python based command line tool to compare Github Users or Repositories

gitcomp A simple python package with a CLI to compare GitHub users and repositories by associating a git_score to each entry which is a weighted sum o

Anirudh Vaish 5 Mar 26, 2022
Python API and CLI for the ikea IDÃ…SEN desk.

idasen This is a heavily modified fork of rhyst/idasen-controller. The IDÃ…SEN is an electric sitting standing desk with a Linak controller sold by ike

Alex 79 Dec 14, 2022
A minimal todo list for your terminal.

todo A minimal todo list for your terminal. Installation Run the following command. pip install git+https://github.com/piero-vic/todo.git Usage todo

Piero Lescano 7 Aug 08, 2022
A terminal application for managing images and artifacts in Azure Container Registry.

acr-browser acr-browser is a terminal-based user interface for managing container images and artifacts in Azure Container Registry. 🚀 This project ow

Sam Dobson 5 Jul 30, 2022