I have some code written in my .travis.yml
written for a Python library. Using lint.travis-ci.org, I came to know that there is some indentation problem in my YAML file. Here is the part which the error points to
install:
- if [[ "${TEST_PY3}" == "false" ]]; then
pip install Cython;
python setup.py build; # To build networkx-metis
mkdir core; # For the installation of networkx core
cd core;
git clone https://github.com/orkohunter/networkx.git;
cd networkx/;
git checkout addons;
python setup.py install;
cd ..;
fi
Where am I wrong? The error says
syntax error: (<unknown>): did not find expected '-' indicator while parsing a block collection at line 32 column 3
It would be great if there were a tool like autopep8
to fix the indentation of YAML files.
You don't have 32 lines in your file (probably because you stripped non-essential data out of the example), but the indentation level points to the line with fi
.
Actually the problem starts earlier and what you want to do is specify the action to take as a multi-line string. You can specify those in YAML in multiple ways but the cleanest is to use the literal scalar indicator "|
", which preserves newlines:
install:
- |
if [[ "${TEST_PY3}" == "false" ]]; then
pip install Cython;
python setup.py build; # To build networkx-metis
mkdir core; # For the installation of networkx core
cd core;
git clone https://github.com/orkohunter/networkx.git;
cd networkx/;
git checkout addons;
python setup.py install;
cd ..;
fi
There is no automatic YAML re-indentation tool for these kind of errors.
Reindenters for Python take working code and make the indentation consistent (replacing TABs, always same indent per level). Python code re-indentation on code with syntax errors, either doesn't work or might produce non-correct results.
Reindenters for YAML face the same problem: what to do if the input doesn't make sense (and what is clear to you and me, is not always clear to a program). Just making everything that doesn't parse well into a multi-line scalar is not a generic solution.
Apart from that, most YAML parsers throw away some information on reading in the files, that you would not want to get lost by re-indenting, including EOL comments, hand crafted anchor names, mapping key ordering, etc. All without violating the requirements in the specification.
If you want to uniformly indent your (correct) YAML you can use the yaml
utility that is part of the [ruamel.yaml][2]
package (disclaimer: I am the author of that package). Your original input used with yaml round-trip .travis.yml
would give:
...
in "<byte string>", line 3, column 3:
- if [[ "${TEST_PY3}" == "false" ...
^
expected <block end>, but found '<scalar>'
in "<byte string>", line 6, column 7:
mkdir core; # For the installati ...
Unfortunately not much more helpful in finding the error, the correct .travis.yml
version run through yaml round-trip .travis.yml
will tell you that it stabilizes on the second round-trip (ie. on the first the extra whitespace is lost). And yaml round-trip .travis.yml --save
gives you:
install:
- |
if [[ "${TEST_PY3}" == "false" ]]; then
pip install Cython;
python setup.py build; # To build networkx-metis
mkdir core; # For the installation of networkx core
cd core;
git clone https://github.com/orkohunter/networkx.git;
cd networkx/;
git checkout addons;
python setup.py install;
cd ..;
fi
Please note that in this # TO build networkx-metis
is not a YAML comment. It is just part of the multi-line string. A comment on a line before the first or after the last would however be preserved.