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

Owner
Python Manage
Management Tool for Python
Python Manage
Official AIdea command line tool

AIdea CLI Official AIdea command line tool for https://aidea-web.tw. Installation Make sure you have installed both Python 3 and pip package manager.

AIdea 5 Dec 15, 2021
A communist shell written in Python

kash A communist shell written in Python It doesn't support escapes, quotes, comment lines, |, &&, , or similar yet. If you need help, get it from

Çınar Yılmaz 1 Dec 10, 2021
A CLI/Shell supporting OpenRobot API and more!

A CLI/Shell supporting JeyyAPI, OpenRobot API and RePI API.

OpenRobot Packages 1 Jan 06, 2022
A very simple and lightweight ToDo app using python that can be used from the command line

A very simple and lightweight ToDo app using python that can be used from the command line

Nilesh Sengupta 2 Jul 20, 2022
DShell, a tool that combines with discord.py and Jishaku to present to you, shell channels.

Discord shell or dshell for short is a Python package that combines with discord.py and Jishaku to transform an ordinary Discord channel into one capable of running bash commands using a Discord bot.

11 Nov 15, 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
Terminal Colored Text for Python

Terminal Colored Text for Python

R3CKhi-**75 3 Sep 10, 2022
A terminal written in Python.

PyDOS Read the title and then you'll figure out what this actually is. Running First, download or clone this repo. Next, run run.py. After this, you c

TechStudent10 2 Mar 01, 2022
Detect secret in source code, scan your repo for leaks. Find secrets with GitGuardian and prevent leaked credentials. GitGuardian is an automated secrets detection & remediation service.

GitGuardian Shield: protect your secrets with GitGuardian GitGuardian shield (ggshield) is a CLI application that runs in your local environment or in

GitGuardian 1.2k Jan 06, 2023
My dotfiles -My configuration, with installations steps.

.dotfiles My configuration, with installations steps. Installation Oh My ZSH Install with this command: sh -c "$(curl -fsSL https://raw.githubusercont

Luca Angioloni 4 Dec 14, 2022
A simple cli tool to commit Conventional Commits

convmoji A simple cli tool to commit Conventional Commits. Requirements Install pip install convmoji convmoji --help Examples A conventianal commit co

3 Jul 04, 2022
Management commands to help backup and restore your project database and media files

Django Database Backup This Django application provides management commands to help backup and restore your project database and media files with vari

687 Jan 04, 2023
Python command line tool and python engine to label table fields and fields in data files.

Python command line tool and python engine to label table fields and fields in data files. It could help to find meaningful data in your tables and data files or to find Personal identifable informat

APICrafter 22 Dec 05, 2022
Shellmon is a tool used to create and control a webshell remotely, created using the Python3

An Simple PHP Webshell Manager Description Shellmon is a tool used to create and control a webshell remotely, created using the Python3 programming la

22XploiterCrew 12 Dec 30, 2022
🎈 `st` is a CLI to quickly kick-off your new Streamlit project

🎈 st - a friendly Streamlit CLI st is a CLI that helps you kick-off a new Streamlit project so you can start crafting the app as soon as possible! Ho

Arnaud 18 Dec 19, 2022
Open-Source Python CLI package for copying DynamoDB tables and items in parallel batch processing + query natural & Global Secondary Indexes (GSIs)

Python Command-Line Interface Package to copy Dynamodb data in parallel batch processing + query natural & Global Secondary Indexes (GSIs).

1 Oct 31, 2021
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
A mini command line tool to spellcheck text files using tadqeek.alsharekh.org

tadqeek_sakhr A mini command line tool to spellcheck text files using tadqeek.alsharekh.org Usage usage: python tadqeek_sakhr.py [-h] -i INPUT [-o OUT

Youssif Shaaban Alsager 5 Dec 11, 2022
Redial is a simple shell application that manages your SSH sessions on Unix terminal.

redial redial is a simple shell application that manages your SSH sessions on Unix terminal. What's New 0.7 (19.12.2019) Basic support for adding ssh

Bahadır Yağan 186 Oct 28, 2022
Standalone script written in Python 3 for generating Reverse Shell one liner snippets and handles the communication between target and client using custom Netcat binaries

Standalone script written in Python 3 for generating Reverse Shell one liner snippets and handles the communication between target and client using custom Netcat binaries. It automates the boring stu

Yash Bhardwaj 3 Sep 27, 2022