Your faithful companion.
pip install zrb
To run a task, you can invoke the following command:
zrb <task> [arguments]
Zrb will automatically load the following task definitions:
ZRB_INIT_SCRIPTS
.:
) to define multiple scripts in ZRB_INIT_SCRIPTS
. For example:ZRB_INIT_SCRIPTS=~/personal/zrb_init.py:~/work/zrb_init.py
zrb_init.py
in your current directory.ZRB_SHOULD_LOAD_BUILTIN
equals 1
or unset.You can write your task definitions in Python. For example:
from zrb import (
runner, Env,
StrInput, ChoiceInput, IntInput, BoolInput, FloatInput, PasswordInput,
Group, Task, CmdTask, HTTPChecker
)
# Simple Python task.
# Usage example: zrb concat --separator=' '
concat = Task(
name='concat', # Task name
inputs=[StrInput(name='separator', description='Separator', default=' ')],
run=lambda *args, **kwargs: kwargs.get('separator', ' ').join(args)
)
runner.register(concat)
# Simple Python with multiple inputs.
register_trainer = Task(
name='register-trainer',
inputs=[
StrInput(name='name', default=''),
PasswordInput(name='password', default=''),
IntInput(name='age', default=0),
BoolInput(name='employed', default=False),
FloatInput(name='salary', default=0.0),
ChoiceInput(
name='starter-pokemon',
choices=['bulbasaur', 'charmender', 'squirtle']
)
],
run=lambda *args, **kwargs: kwargs
)
runner.register(register_trainer)
# Simple CLI task.
# Usage example: zrb hello --name='world'
hello = CmdTask(
name='hello',
inputs=[StrInput(name='name', description='Name', default='world')],
cmd='echo Hello {{input.name}}'
)
runner.register(hello)
# Command group: zrb make
make = Group(name='make', description='Make things')
# CLI task, part of `zrb make` group, depends on `hello`
# Usage example: zrb make coffee
make_coffee = CmdTask(
name='coffee',
group=make,
upstreams=[hello],
cmd='echo Coffee for you β'
)
runner.register(make_coffee)
# CLI task, part of `zrb make` group, depends on `hello`
# Usage example: zrb make beer
make_beer = CmdTask(
name='beer',
group=make,
upstreams=[hello],
cmd='echo Cheers πΊ'
)
runner.register(make_beer)
# Command group: zrb make gitignore
make_gitignore = Group(
name='gitignore', description='Make gitignore', parent=make
)
# CLI task, part of `zrb make gitignore` group,
# making .gitignore for Python project
# Usage example: zrb make gitignore python
make_gitignore_python = CmdTask(
name='python',
group=make_gitignore,
cmd=[
'echo "node_modules/" >> .gitignore'
'echo ".npm" >> .gitignore'
'echo "npm-debug.log" >> .gitignore'
]
)
runner.register(make_gitignore_python)
# CLI task, part of `zrb make gitignore` group,
# making .gitignore for Node.js project
# Usage example: zrb make gitignore node
make_gitignore_nodejs = CmdTask(
name='node',
group=make_gitignore,
cmd=[
'echo "__pycache__/" >> .gitignore'
'echo "venv" >> .gitignore'
]
)
runner.register(make_gitignore_nodejs)
# Long running CLI task
# Usage example: zrb start-server dir='.'
start_server = CmdTask(
name='start-server',
upstreams=[make_coffee, make_beer],
inputs=[StrInput(name='dir', description='Directory', default='.')],
envs=[Env(name='PORT', os_name='WEB_PORT', default='3000')],
cmd='python -m http.server $PORT --directory {{input.dir}}',
checkers=[HTTPChecker(port='{{env.PORT}}')]
)
runner.register(start_server)
# CLI task, depends on `start-server`, throw error
# Usage example: zrb test-error
test_error = CmdTask(
name='test-error',
upstreams=[start_server],
cmd='sleep 3 && exit 1',
retry=0
)
runner.register(test_error)
Once registered, your task will be accessible from the terminal.
For example, you can run a server by performing:
export WEB_PORT=8080
zrb start-server
The output will be similar to this:
Name [world]: Go Frendi
Dir [.]:
π€ β 2023-02-22T08:02:52.611040 β 14426 β€ 1 of 3 β’ π zrb hello β’ Hello Go Frendi
π€ β 2023-02-22T08:02:52.719826 β 14428 β€ 1 of 3 β’ π zrb make coffee β’ Coffee for you β
π€ β 2023-02-22T08:02:52.720372 β 14430 β€ 1 of 3 β’ π zrb make beer β’ Cheers πΊ
π€ β 2023-02-22T08:02:52.845930 β 14432 β€ 1 of 3 β’ π zrb start-server β’ Serving HTTP on 0.0.0.0 port 3000 (http://0.0.0.0:3000/) ...
π€ β 2023-02-22T08:02:52.910192 β 14425 β€ 1 of 1 β’ π http-check β’ HEAD http://localhost:3000/ 200 (OK)
Support zrb growth and development!
β Donate at: https://stalchmst.com/donation
π Submit issues/pull requests at: https://github.com/state-alchemists/zaruba
π€ Follow us at: https://twitter.com/zarubastalchmst
zrb start-server completed in 1.681591272354126 seconds
π€ β 2023-02-22T08:02:52.911657 β 14432 β€ 1 of 3 β’ π zrb start-server β’ 127.0.0.1 - - [22/Feb/2023 08:02:52] "HEAD / HTTP/1.1" 200 -
To run a task programmatically, you need to create a main loop
.
For example:
from zrb import CmdTask
cmd_task = CmdTask(
name='sample',
cmd='echo hello'
)
main_loop = cmd_task.create_main_loop(env_prefix='')
result = main_loop() # This run the task
print(result.output) # Should be "hello"
To enable shell completion, you need to set _ZRB_COMPLETE
variable.
For bash
:
eval $(_ZRB_COMPLETE=bash_source zrb)
For zsh
:
eval $(_ZRB_COMPLETE=zsh_source zrb)
Once set, you will have a shell completion in your session:
zrb <TAB>
zrb md5 hash -<TAB>
Visit click shell completion for more information.
The following configurations are available:
ZRB_HOME_DIR
: Zrb home directory.ZRB_LOGGING_LEVEL
: Logging verbosity.WARNING
CRITICAL
ERROR
WARNING
WARN
(The same as WARNING
)INFO
DEBUG
NOTSET
ZRB_INIT_SCRIPTS
: List of task registration script that should be loaded by default.:
).~/personal/zrb_init.py:~/work/zrb_init.py
ZRB_ENV
: Environment prefix that will be used when loading Operating System's environment.DEV
ZRB_SHOULD_LOAD_BUILTIN
: Whether load builtin tasks or not1
1
0
ZRB_SHELL
: Default shell for running cmdTaskbash
/usr/bin/bash
/usr/bin/sh
node
python
ZRB_SHOW_ADVERTISEMENT
: Whether show advertisement or not.1
1
0
PYTHONUNBUFFERED
will be set to 1
.zrb_init.py
is loaded, Zrb will automatically:ZRB_PROJECT_DIR
to zrb_init.py
's parent directory.ZRB_PROJECT_DIR
to PYTHONPATH
._args
: Shell argument when the task is invoked._task
: Reference to the current task.zrb.builtin_group
.There is a toolkit you can use to test whether Zrb is working as intended.
To use the toolkit, you can invoke the following command:
source ./project.sh
Once you load the toolkit, you can start playing around.
# Run test and serve coverage.
zrb test
# Test zrb in playground
zrb prepare-playground
To publish Zrb, you need a Pypi
account:
You can also create a TestPypi
account:
Once you have your API token, you need to create a ~/.pypirc
file:
[distutils]
index-servers =
pypi
testpypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = pypi-xxx-xxx
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = pypi-xxx-xxx
To publish Zrb, you can do the following:
source ./project.sh
# Publish Zrb to TestPypi
zrb publish-test
# Publish Zrb to Pypi
zrb publish