Command Line Manager + Interactive Shell for Python Projects

Overview

Manage

Command Line Manager + Interactive Shell for Python Projects

Documentation Status

Features

With manage you add a command line manager to your Python project and also it comes with an interactive shell with iPython support.

All you have to do is init your project directory (creating the manage.yml file)

$ pip install manage
$ cd /my_project_root_folder
$ manage init
creating manage.yml....

The file manage.yml describes how manage command should discover your app modules and custom commands and also it defines which objects should be loaded in to the shell

Note

Windows users may need to install proper version of PyYAML depending on the version of that thing you call an operating system, installable available in: https://pypi.python.org/pypi/PyYAML or consider using Linux and don't worry about this as everything works well in Linux except games, photoshop and solitary game :)

The Shell

By default the command manage shell is included, it is a simple Python REPL console with some configurable options.

You can change the banner message to say anything you want, e.g: "Welcome to my shell!" and you can also specify some objects to be automatically imported in to the shell context so when you enter in to the shell you already have your project's common objects available.

Also you can specify a custom function to run or a string based code block to run, useful to init and configure the objects.

Consoles

manage shell can start different consoles by passing the options

  • manage shell --ipython - This is the default (if ipython installed)
  • manage shell --ptpython
  • manage shell --bpython
  • manage shell --python - This is the default Python console including support for autocomplete. (will be default when no other is installed)

The first thing you can do with manage is customizing the objects that will be automatically loaded in to shell, saving you from importing and initializing a lot of stuff every time you need to play with your app via console.

Edit manage.yml with:

project_name: My Awesome Project
help_text: |
  This is the {project_name} interactive shell!
shell:
  console: bpython
  readline_enabled: false  # MacOS has no readline completion support
  banner:
    enabled: true
    message: 'Welcome to {project_name} shell!'
  auto_import:
    display: true
    objects:
      my_system.config.settings:
      my_system.my_module.MyClass:
      my_system.my_module.OtherClass:
        as: NiceClass
      sys.path:
        as: sp
        init:
          insert:
            args:
              - 0
              - /path/to/be/added/automatically/to/sys/path
  init_script: |
    from my_system.config import settings
    print("Initializing settings...")
    settings.configure()

Then the above manage.yaml will give you a shell like this:

$ manage shell
Initializing settings...
Welcome to My Awesome Project shell!
    Auto imported: ['sp', 'settings', 'MyClass', 'NiceCLass']
>>>  NiceClass. 
   
   
    
     # autocomplete enabled
   
   

Watch the demo:

asciicast

Check more examples in:

https://github.com/rochacbruno/manage/tree/master/examples/

The famous naval fate example (used in docopt and click) is in:

https://github.com/rochacbruno/manage/tree/master/examples/naval/

Projects using manage

  • Quokka CMS (A Flask based CMS) is using manage
  • Red Hat Satellite QE tesitng framework (robottelo) is using manage

Custom Commands

Sometimes you need to add custom commands in to your project e.g: A command to add users to your system:

$ manage create_user --name=Bruno --passwd=1234
Creating the user...

manage has some different ways for you to define custom commands, you can use click commands defined in your project modules, you can also use function_commands defined anywhere in your project, and if really needed can define inline_commands inside the manage.yml file

1. Using a custom click_commands module (single file)

Lets say you have a commands module in your application, you write your custom command there and manage will load it

# myproject/commands.py
import click
@click.command()
@click.option('--name')
@click.option('--passwd')
def create_user(name, passwd):
    """Create a new user"""
    click.echo('Creating the user...')
    mysystem.User.create(name, password)

Now you go to your manage.yml or .manage.yml and specify your custom command module.

click_commands:
  - module: commands

Now you run manage --help

$ manage --help
...
Commands:
  create_user  Create a new user
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

Using a click_commands package (multiple files)

It is common to have different files to hold your commands so you may prefer having a commands/ package and some python modules inside it to hold commands.

# myproject/commands/user.py
import click
@click.command()
@click.option('--name')
@click.option('--passwd')
def create_user(name, passwd):
    """Create a new user"""
    click.echo('Creating the user...')
    mysystem.User.create(name, password)
# myproject/commands/system.py
import click
@click.command()
def clear_cache():
    """Clear the system cache"""
    click.echo('The cache will be erased...')
    mysystem.cache.clear()

So now you want to add all those commands to your manage editing your manage file with.

click_commands:
  - module: commands

Now you run manage --help and you have commands from both modules

$ manage --help
...
Commands:
  create_user  Create a new user
  clear_cache  Clear the system cache
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

Custom click_command names

Sometimes the name of commands differ from the name of the function so you can customize it.

click_commands:
  - module: commands.system
    config:
      clear_cache:
        name: reset_cache
        help_text: This resets the cache
  - module: commands.user
    config:
      create_user:
        name: new_user
        help_text: This creates new user

Having different namespaces

If customizing the name looks too much work for you, and you are only trying to handle naming conflicts you can user namespaced commands.

namespaced: true
click_commands:
  - module: commands

Now you run manage --help and you can see all the commands in the same module will be namespaced by modulename_

$ manage --help
...
Commands:
  user_create_user    Create a new user
  system_clear_cache  Clear the system cache
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

And you can even customize namespace for each module separately

Note

If namespaced is true all commands will be namespaced, set it to false in order to define separately

click_commands:
  - module: commands.system
    namespace: sys
  - module: commands.user
    namespace: user

Now you run manage --help and you can see all the commands in the same module will be namespaced.

$ manage --help
...
Commands:
  user_create_user  Create a new user
  sys_clear_cache  Clear the system cache
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

2. Defining your inline commands in manage file directly

Sometimes your command is so simple that you do not want (or can't) have a custom module, so you can put all your commands in yaml file directly.

inline_commands:
  - name: clear_cache
    help_text: Executes inline code to clear the cache
    context:
      - sys
      - pprint
    options:
      --days:
        default: 100
    code: |
      pprint.pprint({'clean_days': days, 'path': sys.path})

Now running manage --help

$ manage --help
...
Commands:
  clear_cache  Executes inline code to clear the cache
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

And you can run using

$ manage clear_cache --days 15

3. Using general functions as commands

And if you already has some defined function (any callable works).

# my_system.functions.py
def create_user(name, password):
    print("Creating user %s" % name)
function_commands:
  - function: my_system.functions.create_user
    name: new_user
    help_text: Create new user
    options:
      --name:
        required: true
      --password:
        required: true

Now running manage --help

$ manage --help
...
Commands:
  new_user     Create new user
  debug        Shows the parsed manage file
  init         Initialize a manage shell in current...
  shell        Runs a Python shell with context

$ manage new_user --name=Bruno --password=1234
Creating user Bruno

Further Explanations

  • You can say, how this is useful?, There's no need to get a separate package and configure everything in yaml, just use iPython to do it. Besides, IPython configuration has a lot more options and capabilities.
  • So I say: Nice! If you don't like it, dont't use it!

Credits

Similar projects

Comments
  • Project name when creating Manage.yml

    Project name when creating Manage.yml

    • Manage version: 0.1.7
    • Python version: 3.4.1
    • Operating System: MacOSX El Capitan

    Description

    The manage project is very useful, but we cannot set a project name when creating the manage.yml file with the manage init it would be nice to have such thing.

    What can be done

    Add an option in the manage init command like "--project-name" and let the user enter his project name as should be.

    ready 
    opened by vmesel 2
  • Update version and pypi package.

    Update version and pypi package.

    • Manage version: manage-0.1.13
    • Python version: 3.7
    • Operating System: Debian (sid)

    Description

    The current master has changes not in pypi, and using the same version. Please change the version, and update the pypi package.

    opened by jorgeecardona 1
  • A DeprecationWarning of PyYAML is shown every time the CLI is used.

    A DeprecationWarning of PyYAML is shown every time the CLI is used.

    • Manage version: 0.1.13
    • Python version: python 3.7.3
    • Operating System: Debian (unstable)

    Description

    The package PyYAML is deprecating the usage of yaml.load without passing explicitly the Loader and a deprecationg message is shown every time I use the manage CLI:

    ../site-packages/manage/cli.py:44: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
      MANAGE_DICT.update(yaml.load(manage_file))
    
    opened by jorgeecardona 1
  • Add py38 to tox, update version, fix a test and set the x-rst tag.

    Add py38 to tox, update version, fix a test and set the x-rst tag.

    Hi,

    With this PR I am just adding the py38 environment to tox and to setup.py, fixing a test that was not passing, and adding the x-rst tag hoping the description in PyPi will now look ok.

    I am also updating the version so installing with pip takes the Yaml change.

    opened by jorgeecardona 0
  • Drop Python 2 support

    Drop Python 2 support

    • Drop Python 2 support
    • Update supported Python 3 versions
    • Apply code format with black
    • Sort imports with isort
    • Replace usage of import_string with import_module
    opened by nixocio 0
  • Initial Update

    Initial Update

    This is my first visit to this fine repo so I have bundled all updates in a single pull request to make things easier for you to merge.

    Close this pull request and delete the branch if you want me to start with single pull requests right away

    Here's the executive summary:

    Updates

    | Name | used | latest | pypi | | --- | --- | --- | --- | | Sphinx | 1.4.4 | 1.4.5 | pypi |

    Pins

    | Name | Pinned to | pypi | | --- | --- | --- | | import-string | 0.1.0 | pypi |

    Changelogs

    import-string -> 0.1.0

    0.1.0


    • First release on PyPI.

    Once you have closed this pull request, I'll create seperate pull requests for every update as soon as I find them.

    That's it for now!

    Happy merging! 🤖

    opened by pyup-bot 0
  • Subcommands are duplicated.

    Subcommands are duplicated.

    When a subcommand is generated and manage is importing the commands from a py file the subcommands get imported as commands and it ends in duplictated commands.

    opened by jorgeecardona 0
  • support entrypoints for plugin based command loading

    support entrypoints for plugin based command loading

    frameworks tend to have on structures of commands, same goes for plugins of such frameworks

    in order to support scope specific extension, it would be a great help, to be able to specify entry points to load commands from

    aka

    commands:
    - entrypoint: myframework.manage_commands
    - module: my_own
    
    opened by RonnyPfannschmidt 0
  • bookmark commands

    bookmark commands

    Idea is:

    $ manage bookmark fup "git fetch upstream"
    $ manage bookmark rbum "git rebase upstream/master"
    $ manage bookmark createadmin "manage adduser --admin --username={0} --email={1}"
    

    then the bookmarks will be saved in local manage.yaml

    manage fup
    manage rbum
    manage createadmin Bruno [email protected]
    
    enhancement 
    opened by rochacbruno 0
  • add option to auto import all flask modules to shell

    add option to auto import all flask modules to shell

    See flask-konsh

    def get_flask_imports():
        ret = {}
        for name in [e for e in dir(flask) if not e.startswith('_')]:
            ret[name] = getattr(flask, name)
        return ret
    

    if in manage.yml shell: import_flask_object: true import all the above

    ready 
    opened by rochacbruno 0
Owner
Python Manage
Management Tool for Python
Python Manage
Bear-Shell is a shell based in the terminal or command prompt.

Bear-Shell is a shell based in the terminal or command prompt. You can navigate files, run python files, create files via the BearUtils text editor, and a lot more coming up!

MichaelBear 6 Dec 25, 2021
A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli. Stream your favorite shows straight from the command line.

A command-line based, minimal torrent streaming client made using Python and Webtorrent-cli. Installation pip install -r requirements.txt It use

Jonardon Hazarika 17 Dec 11, 2022
(BionicLambda Universal SHell) A simple shell made in Python. Docs and possible C port incoming.

blush ?? (BionicLambda Universal SHell) A simple shell made in Python. Docs and possible C port incoming. Note: The Linux executables were made on Ubu

null 3 Jun 30, 2021
ICMP Reverse Shell written in Python 3 and with Scapy (backdoor/rev shell)

icmpdoor - ICMP Reverse Shell icmpdoor is an ICMP rev shell written in Python3 and scapy. Tested on Ubuntu 20.04, Debian 10 (Kali Linux), and Windows

Jeroen van Kessel 206 Dec 29, 2022
Kubernetes shell: An integrated shell for working with the Kubernetes

kube-shell Kube-shell: An integrated shell for working with the Kubernetes CLI Under the hood kube-shell still calls kubectl. Kube-shell aims to provi

CloudNative Labs 2.2k Jan 8, 2023
iTerm2 Shell integration for Xonsh shell.

iTerm2 Shell Integration iTerm2 Shell integration for Xonsh shell. Installation To install use pip: xpip install xontrib-iterm2 # or: xpip install -U

Noorhteen Raja NJ 6 Dec 29, 2022
cmsis-pack-manager is a python module, Rust crate and command line utility for managing current device information that is stored in many CMSIS PACKs

cmsis-pack-manager cmsis-pack-manager is a python module, Rust crate and command line utility for managing current device information that is stored i

pyocd 20 Dec 21, 2022
Notion-cli-list-manager - A simple command-line tool for managing Notion databases

A simple command-line tool for managing Notion List databases. ✨

Giacomo Salici 75 Dec 4, 2022
🔖 Lemnos: A simple, light-weight command-line to-do list manager.

?? Lemnos: CLI To-do List Manager This is a simple program that allows one to manage a to-do list via the command-line. Example $ python3 todo.py add

Rohan Sikand 1 Dec 7, 2022
An interactive cheatsheet tool for the command-line

navi An interactive cheatsheet tool for the command-line. navi allows you to browse through cheatsheets (that you may write yourself or download from

Denis Isidoro 12.2k Dec 31, 2022
adds flavor of interactive filtering to the traditional pipe concept of UNIX shell

percol __ ____ ___ ______________ / / / __ \/ _ \/ ___/ ___/ __ \/ / / /_/ / __/ / / /__/ /_/ / / / .__

Masafumi Oyamada 3.2k Jan 7, 2023
Library and command-line utility for rendering projects templates.

A library for rendering project templates. Works with local paths and git URLs. Your project can include any file and Copier can dynamically replace v

null 808 Jan 4, 2023
xonsh is a Python-powered, cross-platform, Unix-gazing shell language and command prompt.

xonsh xonsh is a Python-powered, cross-platform, Unix-gazing shell language and command prompt. The language is a superset of Python 3.6+ with additio

xonsh 6.7k Jan 8, 2023
A cd command that learns - easily navigate directories from the command line

NAME autojump - a faster way to navigate your filesystem DESCRIPTION autojump is a faster way to navigate your filesystem. It works by maintaining a d

William Ting 14.5k Jan 3, 2023
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
Ros command - Unifying the ROS command line tools

Unifying the ROS command line tools One impairment to ROS 2 adoption is that all

null 37 Dec 15, 2022
Vsm - A manager for the under-utilized mksession command in vim

Vim Session Manager A manager for the under-utilized `mksession` command in vim

Matt Williams 3 Oct 12, 2022
CLI tool for one-line installation of C++/CMake projects.

cmakip When working on virtual environments, Python projects can be installed with a single command invocation, for example pip install --no-deps . .

Artificial and Mechanical Intelligence 4 Feb 15, 2022
Zecwallet-Python is a simple wrapper around the Zecwallet Command Line LightClient written in Python

A wrapper around Zecwallet Command Line LightClient, written in Python Table of Contents About Installation Usage Examples About Zecw

Priveasy 2 Sep 6, 2022