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.
Ralph is a command-line tool to fetch, extract, convert and push your tracking logs from various storage backends to your LRS or any other compatible storage or database backend.

Ralph is a command-line tool to fetch, extract, convert and push your tracking logs (aka learning events) from various storage backends to your

France Université Numérique 18 Jan 05, 2023
topalias - Linux alias generator from bash/zsh command history with statistics, written on Python.

topalias topalias - Linux alias generator from bash/zsh command history with statistics, written on Python. Features Generate short alias for popular

Sergey Chudakov 38 May 26, 2022
Seamlessly run Python code in IPython from Vim

Seamlessly run Python code from Vim in IPython, including executing individual code cells similar to Jupyter notebooks and MATLAB. This plugin also supports other languages and REPLs such as Julia.

Hans Chen 269 Dec 20, 2022
Magma is a NeoVim plugin for running code interactively with Jupyter.

Magma Magma is a NeoVim plugin for running code interactively with Jupyter. Requirements NeoVim 0.5+ Python 3.8+ Required Python packages: pynvim (for

Daniel Csillag 372 Dec 26, 2022
Text based command line webcam photobooth app

Skunkbooth Why See it in action Usage Installation Run Media location Contributing Install Poetry Clone the repo Activate poetry shell Install dev dep

David Yang 45 Dec 26, 2022
A lightweight Python module and command-line tool for generating NATO APP-6(D) compliant military symbols from both ID codes and natural language names

Python military symbols This is a lightweight Python module, including a command-line script, to generate NATO APP-6(D) compliant military symbol icon

Nick Royer 5 Dec 27, 2022
Key-control - A tool for add keys to your Termux app

Key-Control Is a tool for add keys to your Termux app. Cara Penginstalan $ pkg u

Beereva.id 1 Feb 14, 2022
tox-server is a command line tool which runs tox in a loop and calls it with commands from a remote CLI.

Tox Server tox-server is a command line tool which runs tox in a loop and calls it with commands from a remote CLI. It responds to commands via ZeroMQ

Alexander Rudy 3 Jan 10, 2022
A simple script to make the operation of AltServer-Linux more easier with cli

A simple script to make the operation of AltServer-Linux more easier with cli

powen 23 Dec 13, 2022
AML Command Transfer. A lightweight tool to transfer any command line to Azure Machine Learning Services

AML Command Transfer (ACT) ACT is a lightweight tool to transfer any command from the local machine to AML or ITP, both of which are Azure Machine Lea

Microsoft 11 Aug 10, 2022
A command line tool to query source code from your current Python env

wxc wxc (pronounced "which") allows you to inspect source code in your Python environment from the command line. It is based on the inspect module fro

Clément Robert 13 Nov 08, 2022
Conditional Transformer Language Model for Controllable Generation

CTRL - A Conditional Transformer Language Model for Controllable Generation Authors: Nitish Shirish Keskar, Bryan McCann, Lav Varshney, Caiming Xiong,

Salesforce 1.7k Jan 05, 2023
An easy-to-bundle GTK terminal emulator.

EasyTerm An easy-to-bundle GTK terminal emulator. This project is meant to be used as a dependency for other

Bottles 4 May 15, 2022
Command line interface for testing internet bandwidth using speedtest.net

speedtest-cli Command line interface for testing internet bandwidth using speedtest.net Versions speedtest-cli works with Python 2.4-3.7 Installation

Matt Martz 12.4k Jan 08, 2023
Find your broken links, so users don't.

PyAnchor Dead links are an annoyance for websites with an extensive amount of content. A side from the negative impact on SEO, dead links are an annoy

Ricky White 61 Dec 14, 2022
A simple CLI to convert snapshots into EAVT log, and EAVT log into SCD.

EAVT helper CLI Simple CLI to convert snapshots into eavt log, and eavt log into slowly changing dimensions Usage Installation Snapshot to EAVT log EA

2 Apr 07, 2022
A CLI tool to disable and enable security standards controls in AWS Security Hub

Security Hub Controls CLI A CLI tool to disable and enable security standards controls in AWS Security Hub. It is designed to work together with AWS S

AWS Samples 4 Nov 14, 2022
A fantasy life simulator and role-playing game hybrid distributed as CLI, written in Python 3.

Life is Fantasy Epic (LIFE) A fantasy life simulator and role-playing game hybrid distributed as CLI, written in Python 3. This repository will be pro

Pawitchaya Chaloeijanya 2 Oct 24, 2021
Ntfy - 🖥️📱🔔 A utility for sending notifications, on demand and when commands finish.

About ntfy ntfy brings notification to your shell. It can automatically provide desktop notifications when long running commands finish or it can send

Daniel Schep 4.5k Jan 01, 2023
Fylm is a wonderful automated command line app for organizing your film media.

Overview Fylm is a wonderful automated command line app for organizing your film media. You can pronounce it Film or File 'em, whichever you like! It

Brandon Shelley 30 Dec 05, 2022