.. _contributing: Contributing ============ We invite anybody to contribute to the Snakemake Wrapper Repository. If you want to contribute we suggest the following procedure: #. Fork the repository: https://github.com/snakemake/snakemake-wrappers #. Clone your fork locally. #. Locally, create a new branch: ``git checkout -b my-new-snakemake-wrapper`` #. Commit your contributions to that branch and push them to your fork: ``git push -u origin my-new-snakemake-wrapper`` #. Create a pull request. The pull request will be reviewed and included as fast as possible. If your pull request does not get a review quickly, you can `@mention ` previous contributors to a particular wrapper (``git blame``) or regular contributors that you think might be able to give a review. Contributions should follow the coding style of the already present examples, i.e.: * provide a ``meta.yaml`` that describes the wrapper (see the `meta.yaml documentation below `_) * provide an ``environment.yaml`` which lists all required software packages and follows `the respective best practices `_. The packages should be available for installation via the `default anaconda channels `_ or via the `conda`_ channels `bioconda `_ or `conda-forge `_. Other sustainable community maintained channels are possible as well. * add a ``wrapper.py`` or ``wrapper.R`` file that can deal with arbitrary ``input:`` and ``output:`` paths. * provide a minimal test case in a subfolder called ``test``, with an example ``Snakefile`` that shows how to use the wrapper (rule names should be descriptive and written in `snake_case `_), some minimal testing data (also check existing wrappers for suitable data) and add an invocation of the test in ``test.py`` * ensure consistent `formatting`_ of Python files and `linting`_ of Snakefiles. .. _meta: ``meta.yaml`` file ------------------- The following fields are available to use in the wrapper ``meta.yaml`` file. All, except those marked optional, should be provided. * **name**: The name of the wrapper. * **description**: a description of what the wrapper does. * **url**: URL to the wrapper tool webpage. * **authors**: A `sequence`_ of names of the people who have contributed to the wrapper. * **input**: A `mapping`_ or `sequence`_ of required inputs for the wrapper. * **output**: A `mapping`_ or `sequence`_ of output(s) from the wrapper. * **params** (optional): A `mapping`_ of parameters that can be used in the wrapper's ``params`` directive. If no parameters are used for the wrapper, this field can be omitted. * **notes** (optional): Anything of note that does not fit into the scope of the other fields. You can add a newline to the rendered text in these fields with the addition of ``|nl|`` Example ^^^^^^^ .. code-block:: yaml name: seqtk mergepe description: Interleave two paired-end FASTA/Q files url: https://github.com/lh3/seqtk authors: - Michael Hall input: - paired fastq files - can be compressed. output: - > a single, interleaved FASTA/Q file. By default, the output will be compressed, use the param ``compress_lvl`` to change this. params: compress_lvl: > Regulate the speed of compression using the specified digit, where 1 indicates the fastest compression method (less compression) and 9 indicates the slowest compression method (best compression). 0 is no compression. 11 gives a few percent better compression at a severe cost in execution time, using the zopfli algorithm. The default is 6. notes: Multiple threads can be used during compression of the output file with ``pigz``. .. _sequence: https://yaml.org/spec/1.2/spec.html#id2759963 .. _mapping: https://yaml.org/spec/1.2/spec.html#id2759963 .. _formatting: Formatting ---------- Please ensure Python files such as ``test.py`` and ``wrapper.py`` are formatted with |black|_. Additionally, please format your test ``Snakefile`` with |snakefmt|_. .. |black| replace:: ``black`` .. _black: https://github.com/psf/black .. |snakefmt| replace:: ``snakefmt`` .. _snakefmt: https://github.com/snakemake/snakefmt .. _linting: Linting ------- Please `lint`_ your test ``Snakefile`` with:: snakemake -s --lint .. _lint: https://snakemake.readthedocs.io/en/stable/snakefiles/writing_snakefiles.html#best-practices Testing locally --------------- If you want to debug your contribution locally (before creating a pull request), you can install all dependencies with |mamba|_ (or |conda|_). `Install miniconda with the channels as described for bioconda `_ and set up an environment with the necessary dependencies and activate it:: mamba create -n test-snakemake-wrappers snakemake pytest conda snakefmt black conda activate test-snakemake-wrappers Afterwards, from the main directory of the repo, you can run the test(s) for your contribution by `specifying an expression `_ that matches the name(s) of your test(s) via the ``-k`` option of ``pytest``:: pytest test.py -v -k your_test If you also want to test the docs generation locally, create another environment and activate it:: mamba create -n test-snakemake-wrapper-docs sphinx sphinx_rtd_theme pyyaml sphinx-copybutton conda activate test-snakemake-wrapper-docs Then, enter the respective directory and build the docs:: cd docs make html If it runs through, you can open the main page at ``docs/_build/html/index.html`` in a web browser. If you want to start fresh, you can clean up the build with ``make clean``. .. |mamba| replace:: ``mamba`` .. _mamba: https://github.com/mamba-org/mamba .. |conda| replace:: ``conda`` .. _conda: https://conda.io