Snakeboost
Snakeboost provides enhancers and helpers to turbocharge your snakemake workflows. The project is currently in it’s alpha stage.
Script Enhancers
Script enhancer functions wrap around bash scripts given to the shell
directive in Snakemake Rules.
All enhancers have a common interface designed for easy use in your workflow.
To illustrate, we’ll take PipEnv
as an example (it lets you use pip virtual environments!).
Initiate the enhancer
Import the enhancer at the top of your
Snakefile
and instantiate it. Most enhancers take a few arguments defining their global settings.from snakeboost import PipEnv my_env = PipEnv(packages=["numpy", "flake8"], root=("/tmp"))
Use the enhancer in a rule
When instantiated, enhancers can be called using the bash command as an argument.
rule lint_python: inputs: "some-script.py" shell: my_env.script("flake8 {input}")
Some enhancers, such as
PipEnv
, provide multiple functions (e.g..script
,.python
, etc) that provide slightly different functionality. Others, such asTar
, have methods that return a modified instance.from snakeboost import Tar tar = Tar(root="/tmp") rule inspect_tarball: inputs: "some_archive.tar.gz" shell: tar.using(inputs=["{input}"])("ls {input}/")
Here,
tar.using()
returns a new instance ofTar
with modified properties.Tar
itself is callable, taking a string and wrapping it with all the script necessary to unpack your input tar file. Snakeboost uses this slightly convoluted way of setting arguments to allow easy chaining of multiple enhancers. This leads us to step 3:Use
boost()
to chain multiple enhancersChaining many enhancers together can quickly lead to indentation hell:
rule lint_tarred_scripts: inputs: "script_archive.tar.gz" shell: xvfb-run( tar.using(inputs=["{input}"])( my_env.script( "flake8 {input}/script.py" ) ) )
The
boost()
function lets you rewrite this as:from snakeboost import Boost boost = Boost() rule lint_tarred_scripts: inputs: "script_archive.tar.gz" shell: boost( xvfb_run, tar.using(inputs=["{input}"]), my_env.script, "flake8 {input}/script.py" )
That makes your rules much cleaner! However, boost provides a much more important function, described in full detail on the boost page…
Contributing
If you have a small utility function for your Snakemake workflows, it would likely make a great addition to the Snakeboost ecosystem. Script enhancers should follow the basic interface of the other enhancers: a class initialized with global settings that exposes one or more functions that take a bash script as argument.
Snakebids uses Poetry for dependency management and pre-commit for Quality Assurance tests. If Poetry is not already installed on your system, follow the instructions on their website. Then clone the repo and initialize by running:
poetry install
poetry run pre-commit install