snakefmt: snakefmt corrupts heredoc string
snakefmt v0.4.0 reformats this rule:
rule one:
output:
out_file="out.txt",
shell:
r"""
cat <<'EOF'> tmp.txt
touch {output}
EOF
bash tmp.txt
"""
into:
rule one:
output:
out_file="out.txt",
shell:
r"""
cat <<'EOF'> tmp.txt
touch {output}
EOF
bash tmp.txt
"""
the reformatted indentation makes the heredoc invalid since bash expects the closing EOF at the start of the line. When execute it I get:
snakemake -p -j 1
Building DAG of jobs...
Using shell: /bin/bash
Provided cores: 1 (use --cores to define parallelism)
Rules claiming more threads will be scaled down.
Job stats:
job count min threads max threads
----- ------- ------------- -------------
all 1 1 1
one 1 1 1
total 2 1 1
Select jobs to execute...
[Tue Oct 26 09:06:30 2021]
rule one:
output: out.txt
jobid: 1
resources: tmpdir=/tmp
cat <<'EOF'> tmp.txt
touch out.txt
EOF
bash tmp.txt
/bin/bash: line 6: warning: here-document at line 1 delimited by end-of-file (wanted `EOF')
Waiting at most 5 seconds for missing files.
I tried to upgrade to snakefmt 0.4.4 using mamba. This maybe a separate issue, I get:
mamba update snakefmt # Completes OK and installs 0.4.4
snakefmt -h
Traceback (most recent call last):
File "/home/dario/miniconda3/envs/tritume/bin/snakefmt", line 6, in <module>
from snakefmt.snakefmt import main
File "/home/dario/miniconda3/envs/tritume/lib/python3.6/site-packages/snakefmt/snakefmt.py", line 9, in <module>
from black import get_gitignore
File "/home/dario/miniconda3/envs/tritume/lib/python3.6/site-packages/black/__init__.py", line 48, in <module>
from black.files import find_project_root, find_pyproject_toml, parse_pyproject_toml
File "/home/dario/miniconda3/envs/tritume/lib/python3.6/site-packages/black/files.py", line 26, in <module>
from black.handle_ipynb_magics import jupyter_dependencies_are_installed
File "/home/dario/miniconda3/envs/tritume/lib/python3.6/site-packages/black/handle_ipynb_magics.py", line 15, in <module>
from typing_extensions import TypeGuard
ImportError: cannot import name 'TypeGuard'
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 18 (8 by maintainers)
Commits related to this issue
- fix: don't format r-strings [#123] — committed to mbhall88/snakefmt by mbhall88 2 years ago
- fix: do not align the inside of multiline strings [#123]] — committed to mbhall88/snakefmt by mbhall88 2 years ago
- fix: don't format r-strings [#123] — committed to snakemake/snakefmt by mbhall88 2 years ago
- fix: do not align the inside of multiline strings [#123]] — committed to snakemake/snakefmt by mbhall88 2 years ago
@bricoletc :
I suspect that is going to be tricky because
EOFis not a special keyword. You can delimit the heredoc with any string you like (well, not any string…). Other tricky cases could be like:Personally, I would leave the content of the strings alone and just re-align the opening and closing quotes.
I would be happy for r-strings to be left alone (I got the habit of always using r-strings for shell directives unless required otherwise) but I would still consider it a bug. A user may write a heredoc without r-formatting and find it broken after snakefmt.