edwh
Table of Contents
Installation
pipx install edwh
# or: uvenv install edwh
# or with all plugins:
pipx install[plugins]
# or with specific plugins:
pipx install[multipass,restic]
# managing plugins later:
edwh plugins
edwh plugin.add multipass
edwh plugin.remove multipass
Usage
# to see all available commands:
ew # or `edwh`
# to see help about a specific namespace:
ew help <namespace> # e.g. `ew help plugin`
# to see help about a specific command:
ew help <command> # e.g. `ew help plugin.list`
Sudo authentication
edwh sudo verifies your sudo password and safely stores it temporarily so commands that require sudo can run without
prompting again.
By default, EDWH uses the operating system keyring (for example, GNOME Secret Service on Linux). This is the preferred backend when the desktop session and its keyring are available.
When the system keyring is locked, edwh sudo offers an SSH-agent fallback. If you accept, EDWH lists the public keys
available through ssh-add -L; select the key whose agent should unlock the encrypted EDWH keyring. The selection is
recorded in ~/.config/ssh-agent-keyring/config.json, the SSH-agent backend's documented configuration file, and later
EDWH commands automatically use that backend.
The SSH-agent backend requires a reachable agent, SSH_AUTH_SOCK, and the selected key loaded in that agent. For a
remote development machine, connect with agent forwarding (ssh -A or ForwardAgent yes). The sudo password remains
encrypted on disk; access depends on the selected SSH agent rather than a second keyring password.
Linting
edwh lint runs Ruff and Ty by default. Disable either tool for a specific project in its pyproject.toml:
[tool.edwh.lint]
ruff = false
ty = false
edwh fmt sorts imports and reformats Python code with Ruff.
Releasing plugins
edwh plugin.release warns when a project still uses Hatchling or when its
--hatch build fallback is selected. It also warns when a project's uv_build
requirement no longer matches edwh's current recommendation. Silence any of
these warnings for a project:
[tool.edwh.release]
warn-hatchling = false
warn-hatch-build = false
warn-uv-build = false
Testing
edwh test.run runs pytest with coverage by default. It prefers ./venv/bin/pytest, falls back to
pytest from PATH, and requires pytest-cov in the selected environment.
edwh test.run
edwh test.run -k test_specific_behavior
edwh test.run --html
edwh test.run --no-coverage
If a project provides its own test.tasks.py, edwh warns about the override and that local test.run
replaces the built-in task.
Task Load Order
Commands are loaded in the following order:
-
EDWH Package:
- Loaded into the global namespace and its own namespaces (like
ew plugins.).
- Loaded into the global namespace and its own namespaces (like
-
Plugins:
- Loaded into their own namespaces (like
ew mp.).
- Loaded into their own namespaces (like
-
Current Directory:
- Loaded into the
local.namespace. If it doesn't exist, it traverses up the directory tree - (e.g.,
../tasks.py,../../tasks.py).
- Loaded into the
-
Other Local Tasks:
- Other local tasks with their own namespace are loaded (e.g.,
namespace.tasks.py) and can be invoked withedwh namespace.command.
- Other local tasks with their own namespace are loaded (e.g.,
-
Personal Global Tasks:
- Personal global tasks (e.g.,
~/.config/edwh/tasks.py) are also loaded into the global namespace, useful for shortcuts, custom aliases, etc. (+add_alias).
- Personal global tasks (e.g.,
-
Personal Namespaced Tasks:
- Personal tasks with their own namespace (e.g.,
~/.config/edwh/namespace.tasks.py). Similar to a plugin, but for personal use.
- Personal tasks with their own namespace (e.g.,
Plugins
Multipass
- pip name:
edwh-multipass-plugin - github:
educationwarehouse/edwh-multipass-plugin - plugin name:
edwh[multipass] - subcommand namespace:
mp
Restic
- pip name:
edwh-restic-plugin - github:
educationwarehouse/edwh-restic-plugin - plugin name:
edwh[restic] - subcommand namespace:
restic
Pip Compile
- pip name:
edwh-pipcompile-plugin - github:
educationwarehouse/edwh-pipcompile-plugin - plugin name:
edwh[pip] - subcommand namespace:
pip
Bundler
- pip name:
edwh-bundler-plugin - github:
educationwarehouse/edwh-bundler-plugin - plugin name:
edwh[bundler] - subcommand namespace:
bundle
Server Provisioning
- pip name:
edwh-server-provisioning-plugin - github:
educationwarehouse/server_provisioning - plugin name:
edwh[server-provisioning] - subcommand namespace:
remote
b2
- pip name:
edwh-b2-plugin - github:
educationwarehouse/edwh-b2-plugin - plugin name:
edwh[b2] - subcommand namespace:
b2
Locust
- pip name:
edwh-locust-plugin - github:
educationwarehouse/edwh-locust-plugin - plugin name:
edwh[locust] - subcommand namespace:
locust
sshkey
- pip name:
edwh-sshkey-plugin - github:
educationwarehouse/edwh-sshkey-plugin - plugin name
edwh[sshkey] - subcommand namespace
sshkey
sshfs
- pip name:
edwh-sshfs-plugin - github:
educationwarehouse/edwh-sshfs-plugin - plugin name
edwh[sshfs] - subcommand namespace
sshfs
files
- pip name:
edwh-files-plugin - github:
educationwarehouse/edwh-files-plugin - plugin name
edwh[files] - subcommand namespace
file
whitelabel
- pip name:
edwh-whitelabel-plugin - github:
educationwarehouse/edwh-whitelabel-plugin - plugin name
edwh[whitelabel] - subcommand namespace
wl
devdb
- pip name:
edwh-devdb-plugin - github:
educationwarehouse/edwh-devdb-plugin - plugin name
edwh[devdb] - subcommand namespace
devdb
Improvements to @task
The edwh.improved_task decorator enhances the functionality of the standard @task decorator from Invoke by
introducing additional features:
-
Flags: You can now specify custom flags for command line arguments. This allows you to define aliases, rename arguments (e.g., using
--jsonfor an argument namedas_json), and create custom short flags (e.g.,--excludecan also be represented as-x). -
Hookable: The improved task supports hooks that allow you to run additional tasks after the main task execution. If the
hookableoption is set toTrue, any tasks found across namespaces with the same name will be executed in sequence, passing along the context and any provided arguments.
The return value of a hookable task will be available in the context under the key result.
Using a dictionary as the return value is recommended, as it allows you to merge the results of multiple cascading tasks.
Example Usage
from edwh import improved_task as task
@task(flags={"exclude": ["--exclude", "-x"], "as_json": ["--json"]}, hookable=True)
def process_data(ctx, exclude: str, as_json: bool = False):
# Task implementation here
return {
"data": [],
}
# other plugin (or local tasks.py) can now also specify 'process_data':
@task()
def process_data(ctx, exclude: str):
# the cascading function can choose whether to include the arguments `exclude` and `as_json` or not.
# this can be cherry-picked as long as the names match the arguments of the main function.
print(
ctx["result"] # will contain {"data": []}
)
License
edwh is distributed under the terms of the MIT license.
Changelog
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 edwh-1.14.1.tar.gz.
File metadata
- Download URL: edwh-1.14.1.tar.gz
- Upload date:
- Size: 63.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32864d06974fe5931f99e62e3a459efef5a360c237b9c4cf7935cecfbf824b66
|
|
| MD5 |
00061ee81a5c1cd170f550b912356337
|
|
| BLAKE2b-256 |
8da584872d3e381e7d4ace80fe3e6140b0a069064c3ee4093039e31082e6b82c
|
File details
Details for the file edwh-1.14.1-py3-none-any.whl.
File metadata
- Download URL: edwh-1.14.1-py3-none-any.whl
- Upload date:
- Size: 66.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39441da5631a6f5cbf32c13563ce6a4985492317673a97321f51da8c783be1da
|
|
| MD5 |
d75f83e7aa400c425f64e27485ba3353
|
|
| BLAKE2b-256 |
103ce93680cd09a47b80eed19b8de55525f82ffa413ce4737a5676a976a4896d
|