fmartingr
/
jeeves
Archived
1
0
Fork 0

Added jeeves.cli for basic CLI interaction

This commit is contained in:
Felipe Martin 2019-10-03 13:01:45 +02:00
parent 6bcbef4280
commit f0ee511c21
Signed by: fmartingr
GPG Key ID: 716BC147715E716F
7 changed files with 130 additions and 3 deletions

3
jeeves/cli/__init__.py Normal file
View File

@ -0,0 +1,3 @@
from .cli import main
__all__ = ["main"]

3
jeeves/cli/__main__.py Normal file
View File

@ -0,0 +1,3 @@
from .cli import main
main()

44
jeeves/cli/cli.py Normal file
View File

@ -0,0 +1,44 @@
import click
from jeeves.cli.echo import info, error, title, success
from jeeves.core.parsers import FlowParser
from jeeves.core.executor import Executor
@click.group()
def main():
pass
@main.command()
@click.argument("defintinion_file", type=click.File())
@click.option(
"--output",
"print_output",
is_flag=True,
default=False,
help="Display output for flow",
)
def execute(defintinion_file, print_output):
info(f"Running flow from {defintinion_file.name}")
flow = FlowParser.from_json(defintinion_file.read())
title(f"Running flow: {flow.name}")
executor = Executor(flow)
for n, step in enumerate(executor.steps, start=1):
click.echo(
f" ** Running step [{n}/{executor.step_count}]: {step.task.name}\r",
nl=False,
)
result = executor.execute_step(step)
if not result.success:
error(f"Executing step [{n}/{executor.step_count}]: {step.task.name}")
break
else:
success(f"Running step [{n}/{executor.step_count}]: {step.task.name}")
if print_output:
title("Full output:")
click.echo("\n".join(executor._execution.output))

25
jeeves/cli/echo.py Normal file
View File

@ -0,0 +1,25 @@
import click
def title(string: str):
click.echo(click.style(f"=== {string}", bold=True))
def info(string: str):
symbol = click.style("(i)", fg="blue", bold=True)
click.echo(f"{symbol} {string}")
def error(string: str):
symbol = click.style("err", fg="red", bold=True)
click.echo(f"{symbol} {string}")
def warning(string: str):
symbol = click.style("[!]", fg="yellow", bold=True)
click.echo(f"{symbol} {string}")
def success(string: str):
symbol = click.style("ok!", fg="green", bold=True)
click.echo(f"{symbol} {string}")

51
poetry.lock generated
View File

@ -77,7 +77,7 @@ version = "2.0.1"
six = "*"
[[package]]
category = "dev"
category = "main"
description = "Composable command line interface toolkit"
name = "click"
optional = false
@ -154,6 +154,30 @@ optional = false
python-versions = ">=2.7"
version = "0.3"
[[package]]
category = "dev"
description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby."
name = "factory-boy"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.12.0"
[package.dependencies]
Faker = ">=0.7.0"
[[package]]
category = "dev"
description = "Faker is a Python package that generates fake data for you."
name = "faker"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.0.2"
[package.dependencies]
python-dateutil = ">=2.4"
six = ">=1.10"
text-unidecode = "1.3"
[[package]]
category = "dev"
description = "the modular source code checker: pep8, pyflakes and co"
@ -493,6 +517,17 @@ version = "0.2.1"
[package.dependencies]
pytest = ">=3.5.0"
[[package]]
category = "dev"
description = "Extensions to the standard Python datetime module"
name = "python-dateutil"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
version = "2.8.0"
[package.dependencies]
six = ">=1.5"
[[package]]
category = "main"
description = "World timezone definitions, modern and historical"
@ -544,6 +579,14 @@ version = "0.3.0"
[[package]]
category = "dev"
description = "The most basic Text::Unidecode port"
name = "text-unidecode"
optional = false
python-versions = "*"
version = "1.3"
[[package]]
category = "main"
description = "Python Library for Tom's Obvious, Minimal Language"
name = "toml"
optional = false
@ -592,7 +635,7 @@ version = "0.6.0"
more-itertools = "*"
[metadata]
content-hash = "d8b854354df97bc8300f8e8de3b745dc3ff1e98f4e99a8c792aa3348955061c7"
content-hash = "9ad7cfdc1c634ec9d2f9ae1e01da68a838db1d49289b092cf992fa16da4e3ed1"
python-versions = "^3.7"
[metadata.hashes]
@ -612,6 +655,8 @@ django-dramatiq = ["492ef6e216ca6ce1c5b09447b2be554ad299207d625649f2e934d28f96af
django-environ = ["6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde", "c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4"]
dramatiq = ["6d4b21b52baa275c4664126237b3f0029545815b84553904814e43b3b2f58b31", "9cec395ac460eb804e3cca6021cb274011b085843fa85d48d94e9339f7bc2ac3"]
entrypoints = ["589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", "c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"]
factory-boy = ["728df59b372c9588b83153facf26d3d28947fc750e8e3c95cefa9bed0e6394ee", "faf48d608a1735f0d0a3c9cbf536d64f9132b547dae7ba452c4d99a79e84a370"]
faker = ["45cc9cca3de8beba5a2da3bd82a6e5544f53da1a702645c8485f682366c15026", "a6459ff518d1fc6ee2238a7209e6c899517872c7e1115510279033ffe6fe8ef3"]
flake8 = ["19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", "8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696"]
identify = ["4f1fe9a59df4e80fcb0213086fcf502bc1765a01ea4fe8be48da3b65afd2a017", "d8919589bd2a5f99c66302fec0ef9027b12ae150b0b0213999ad3f695fc7296e"]
importlib-metadata = ["aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", "d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af"]
@ -643,12 +688,14 @@ pyparsing = ["6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80",
pytest = ["13c1c9b22127a77fc684eee24791efafcef343335d855e3573791c68588fe1a5", "d8ba7be9466f55ef96ba203fc0f90d0cf212f2f927e69186e1353e30bc7f62e5"]
pytest-django = ["264fb4c506db5d48a6364c311a0b00b7b48a52715bad8839b2d8bee9b99ed6bb", "4adfe5fb3ed47f0ba55506dd3daf688b1f74d5e69148c10ad2dd2f79f40c0d62"]
pytest-tldr = ["008b7d53cabbce9d49ee7a92754ed4adafc056bc49ae01b257c2ffb1f5ce2408", "dca4a464a002f389677f4c42f5b9c815aae43219d73ecfe6b7fffe2d190e38eb"]
python-dateutil = ["7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", "c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"]
pytz = ["26c0b32e437e54a18161324a2fca3c4b9846b74a8dccddd843113109e1116b32", "c894d57500a4cd2d5c71114aaab77dbab5eabd9022308ce5ac9bb93a60a6f0c7"]
pyyaml = ["0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", "01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", "5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", "5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", "7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", "7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", "87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", "9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", "a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", "b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", "b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", "bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", "f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8"]
redis = ["98a22fb750c9b9bb46e75e945dc3f61d0ab30d06117cbb21ff9cd1d315fedd3b", "c504251769031b0dd7dd5cf786050a6050197c6de0d37778c80c08cb04ae8275"]
rope = ["6b728fdc3e98a83446c27a91fc5d56808a004f8beab7a31ab1d7224cecc7d969", "c5c5a6a87f7b1a2095fb311135e2a3d1f194f5ecb96900fdd0a9100881f48aaf", "f0dcf719b63200d492b85535ebe5ea9b29e0d0b8aebeb87fe03fc1a65924fdaf"]
six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"]
sqlparse = ["40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177", "7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"]
text-unidecode = ["1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", "bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"]
toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"]
traitlets = ["9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", "c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"]
virtualenv = ["680af46846662bb38c5504b78bad9ed9e4f3ba2d54f54ba42494fdf94337fe30", "f78d81b62d3147396ac33fc9d77579ddc42cc2a98dd9ea38886f616b33bc7fb2"]

View File

@ -4,6 +4,9 @@ version = "0.1.0"
description = ""
authors = ["Felipe Martin <me@fmartingr.com>"]
[tool.poetry.scripts]
jeeves = "jeeves.cli:main"
[tool.poetry.dependencies]
python = "^3.7"
django = "^2.2"
@ -12,6 +15,8 @@ jinja2 = "^2.10"
pydantic = "^0.32.2"
django_dramatiq = "^0.8.0"
dramatiq = {version = "^1.7", extras = ["redis"]}
click = "^7.0"
toml = "^0.10.0"
[tool.poetry.dev-dependencies]
black = {version = "^18.3-alpha.0", allows-prereleases = true}

View File

@ -11,6 +11,6 @@ include_trailing_comma = True
length_sort = 1
lines_between_types = 0
line_length = 88
known_third_party = django,dramatiq,environ,factory,faker,pydantic,pytest,toml
known_third_party = click,django,dramatiq,environ,factory,faker,pydantic,pytest,toml
sections = FUTURE, STDLIB, DJANGO, THIRDPARTY, FIRSTPARTY, LOCALFOLDER
no_lines_before = LOCALFOLDER