Lightweight Python task runner that just gets it
Project description
๐ฅ๏ธ dony
A lightweight Python command runner with simple and consistent workflow for managing project commands.
A Justfile alternative.
How it works
Define your commands in donyfiles/ in the root of your project.
import dony
@dony.command()
def hello_world():
"""Prints "Hello, World!" """
dony.shell('echo "Hello, World!')
Run dony to fuzzy-search your commands from anywhere in your project.
๐ squash_and_migrate
๐ release
โ ๐ hello_world
3/3 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Select command ๐
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ Prints "Hello, World!" โ
โ โ
โ โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Or call them directly: dony <command_name> [--arg value].
Commands
import dony
@dony.command()
def greet(
greeting: str = 'Hello',
name: str = None
):
name = name or dony.input('What is your name?')
dony.shell(f"echo {greeting}, {name}!")
- Use convenient shell wrapper
dony.shell - Use a bundle of useful user interaction functions, like
input,confirmandpress_any_key_to_continue - Run any command without any arguments - defaults are mandatory
Example
import re
import dony
@dony.command()
def squash_and_migrate(
new_branch: str = None,
commit_message: str = None,
):
"""Squashes current branch to main, checkouts to a new branch"""
# - Get default branch if not set
new_branch = (
new_branch or f"workflow_{dony.shell('date +%Y%m%d_%H%M%S', quiet=True)}"
)
# - Get current branch
original_branch = dony.shell(
"git branch --show-current",
quiet=True,
)
# - Get commit message from the user
if not commit_message:
while True:
commit_message = dony.input(
f"Enter commit message for merging branch {original_branch} to main:"
)
if bool(
re.match(
r"^(?:(?:feat|fix|docs|style|refactor|perf|test|chore|build|ci|revert)(?:\([A-Za-z0-9_-]+\))?(!)?:)\s.+$",
commit_message.splitlines()[0],
)
):
break
dony.print("Only conventional commits are allowed, try again")
# - Squash and migrate
dony.shell(
f"""
# - Make up to date
git diff --cached --name-only | grep -q . && git stash squash_and_migrate-{new_branch}
git checkout main
git pull
# - Merge
git merge --squash {original_branch}
git commit -m "{commit_message}"
git push
# - Remove current branch
git branch -D {original_branch}
git push origin --delete {original_branch}
# - Create new branch
git checkout -b {new_branch}
git push --set-upstream origin {new_branch}
""",
)
Use cases
- Build & Configuration
- Quality & Testing
- Release Management
- Deployment & Operations
- Documentation & Resources
- Git management
Installation
Ensure you have the following prerequisites:
- Python 3.8 or higher
pipxfor isolated installation (brew install pipxon macOS)fzffor fuzzy command selection (brew install fzfon macOS)
Then install the package with pipx:
pipx install dony
Initialize your project:
dony --init
Creates a donyfiles/ folder with a sample command and a uv virtual environment.
donyfiles/
donyfiles/
... (uv environment)
โโโ commands/
โ โโโ my_command.py # one command per file
โ โโโ my-service/
โ โ โโโ service_command.py # will be displayed as `my-service/service_command`
โ โ โโโ _helper.py # non-command file
License
MIT License. See LICENSE for details.
Author
Mark Lidenberg marklidenberg@gmail.com
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dony-0.1.5.tar.gz.
File metadata
- Download URL: dony-0.1.5.tar.gz
- Upload date:
- Size: 79.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a37392f65314a27854202b51550b20c3f6ff4e31df7c16aef830a2f830b6d9c
|
|
| MD5 |
d4a7019dc9d509ca03cc8a602280cffe
|
|
| BLAKE2b-256 |
f37a7ebe33e88685ada2c3d6cd04a8b13ab2f2eee1dc0102e6d871396fecc280
|
File details
Details for the file dony-0.1.5-py3-none-any.whl.
File metadata
- Download URL: dony-0.1.5-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d30dae0ae36e7eb942e9b66084ea78b0de222dbd20758291be005e8c290df90c
|
|
| MD5 |
826fa3637dde66b0cc629b0c332b8be5
|
|
| BLAKE2b-256 |
2e97433249313b25fda624fbeae1b2a20542cc3e2a1393dd76faa6d10dd44108
|