Introduction¶
Local development productivity tools meant to smooth and ease developers day to day work. It is meant to be cross-platform but for now is tested using MacOs and Ubuntu
This are few examples¶
- unified command line interfaces for multiple cli tools
- interactive command line mode
- this act as an interactive wrapper on top of existing cli tools
- also allow extending the existing cli tools with auto-completion, input enhanced wizard or description
- allow switching between command namespaces in the same terminal
- Implement custom CLI tools using Python, fully integrate with all LCLI tool features:
- just write some code class or function and configure them to be wired in application
- use Fire to auto document Python objects, so all you should do is to focus on business logic
Features¶
Fire mode¶
In fire mode the application allow user to configure a hierarchy of objects that fit its needs for various project. The user can navigate and execute the hierarchy using Fire library by Google. “Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.” https://github.com/google/python-fire
Interactive mode¶
Most often during the development process developers are using various tools for various projects. The interactive mode purpose is to improve productivity by offering auto-completion details on the spot. This is implemented on top of python cmd package: https://docs.python.org/3/library/cmd.html
Getting Started¶
Installation process¶
Install from source
# Using invoke
invoke install
#from project root directory
./install
#or
python3 -m pip install -r requirements.txt
python3 -m pip install . --user
Software dependencies¶
This is a Python package available as MIT License and is depending on following packages:
- fire https://github.com/google/python-fire/releases
- pinject https://github.com/google/pinject/releases
- PyYAML
- prompt_toolkit
- pyfiglet
- blessings
- tk
- appJar
- jsonschema
Latest releases¶
- V-0.2.2 - First released version.
API references¶
Build and Test¶
Build¶
# Using invoke
invoke build
Test¶
# Using invoke
invoke test
invoke coverage
# Using pytest
py.test
pytest --cov=src/lcli/ .
Use cases¶
:raw-html-m2r:`<img src=”https://img.youtube.com/vi/L9orYXE1nlU/hqdefault.jpg” width=”50%”> <https://youtu.be/L9orYXE1nlU>`_
Author¶
Contribute¶
Feel free to contribute to this project and make developer life essayer:
- by submitting new ideas as a github issue here
- by making pull request with specific bug fixes
- for new features or architectural change please contact George Babarus to avoid double work on any way.
Useful links¶
- https://mypy.readthedocs.io/en/latest/generics.html#generics
- https://code-maven.com/interactive-shell-with-cmd-in-python
- https://www.journaldev.com/16140/python-system-command-os-subprocess-call
- https://stackoverflow.com/questions/3262569/validating-a-yaml-document-in-python
- https://github.com/oclif/oclif#-cli-types
- https://medium.com/the-z/getting-started-with-oclif-by-creating-a-todo-cli-app-b3a2649adbcf
Installation¶
Install the package (or add it to your requirements.txt
file):
# From source
$ invoke install
# or
# install in user space
$ ./install -u
#install it globally
$ ./install
# From repository
$ pip install lcli
# or simply install it using python in root of the repository
$ python -m pip install -r requirements.txt
$ python -m pip install . --user
Note
Note that form this point on there are two options to use lcli
- Configure the build in cli to support your custom cli commands, and expose better API for the existing commands. See Configuration
- Build your own cli application by extending python package as in example bellow
# Build your own cli application
import os
from lcli.app import App
class YourOwnApp(App):
pass
def main():
try:
project_root_path = os.path.realpath(os.path.dirname(__file__))
app = YourOwnApp(app_path=project_root_path)
app.run()
except Exception as error:
# process errors
if __name__ == '__main__':
main()
Contributing¶
Structural Elements¶
Table of Contents
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Document Section¶
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Document Subsection¶
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed.
Document Subsubsection¶
Donec non rutrum lorem. Aenean sagittis metus at pharetra fringilla. Nunc sapien dolor, cursus sed nisi at, pretium tristique lectus. Sed pellentesque leo lectus, et convallis ipsum euismod a. Integer at leo vitae felis pretium aliquam fringilla quis odio. Sed pharetra enim accumsan feugiat pretium. Maecenas at pharetra tortor. Morbi semper eget mi vel finibus. Cras rutrum nulla eros, id feugiat arcu pellentesque ut. Sed finibus tortor ac nisi ultrices viverra. Duis feugiat malesuada sapien, at commodo ante porttitor ac. Curabitur posuere mauris mi, vel ornare orci scelerisque sit amet. Suspendisse nec fringilla dui.
Document Paragraph¶
Pellentesque nec est in odio ultrices elementum. Vestibulum et hendrerit sapien, quis vulputate turpis. Suspendisse potenti. Curabitur tristique sit amet lectus non viverra. Phasellus rutrum dapibus turpis sed imperdiet. Mauris maximus viverra ante. Donec eu egestas mauris. Morbi vulputate tincidunt euismod. Integer vel porttitor neque. Donec at lacus suscipit, lacinia lectus vel, sagittis lectus.
Structural Elements 2¶
Etiam turpis ante, luctus sed velit tristique, finibus volutpat dui. Nam sagittis vel ante nec malesuada. Praesent dignissim mi nec ornare elementum. Nunc eu augue vel sem dignissim cursus sed et nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque dictum dui sem, non placerat tortor rhoncus in. Sed placerat nulla at rhoncus iaculis.
Document Section¶
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Document Subsection¶

This is a caption for a figure. Text should wrap around the caption.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur in eros et blandit. Nunc maximus, nisl at auctor vestibulum, justo ex sollicitudin ligula, id faucibus urna orci tristique nisl. Duis auctor rutrum orci, in ornare lacus condimentum quis. Quisque arcu velit, facilisis quis interdum ac, hendrerit auctor mauris. Curabitur urna nibh, porttitor at ante sit amet, vestibulum interdum dolor. Duis dictum elit orci, tincidunt imperdiet sem pellentesque et. In vehicula pellentesque varius. Phasellus a turpis sollicitudin, bibendum massa et, imperdiet neque. Integer quis sapien in magna rutrum bibendum. Integer cursus ex sed magna vehicula finibus. Proin tempus orci quis dolor tempus, nec condimentum odio vestibulum. Etiam efficitur sollicitudin libero, tincidunt volutpat ligula interdum sed. Praesent congue sagittis nisl et suscipit. Vivamus sagittis risus et egestas commodo.Cras venenatis arcu in pharetra interdum. Donec quis metus porttitor tellus cursus lobortis. Quisque et orci magna. Fusce rhoncus mi mi, at vehicula massa rhoncus quis. Mauris augue leo, pretium eget molestie vitae, efficitur nec nulla. In hac habitasse platea dictumst. Sed sit amet imperdiet purus.
Plugins for LCIL¶
Table of Contents
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Document Section¶
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Demo¶
Table of Contents
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Document Section¶
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed condimentum nulla vel neque venenatis, nec placerat lorem placerat. Cras purus eros, gravida vitae tincidunt id, vehicula nec nulla. Fusce aliquet auctor cursus. Phasellus ex neque, vestibulum non est vitae, viverra fringilla tortor. Donec vestibulum convallis justo, a faucibus lorem vulputate vel. Aliquam cursus odio eu felis sodales aliquet. Aliquam erat volutpat. Maecenas eget dictum mauris. Suspendisse arcu eros, condimentum eget risus sed, luctus efficitur arcu. Cras ut dictum mi. Nulla congue interdum lorem, semper semper enim commodo nec.
Build your own cli application¶
Table of Contents
Extend lcli object¶
Simple example¶
# Build your own cli application
import os
from lcli.app import App
class YourOwnApp(App):
pass
def main():
try:
project_root_path = os.path.realpath(os.path.dirname(__file__))
app = YourOwnApp(app_path=project_root_path)
app.run()
except Exception as error:
# process errors
if __name__ == '__main__':
main()