Code report

The following analysing modules (analysers) are currently added to Universum:

Analysers are separate scripts, fully compatible with Universum. It is possible to use them as independent Python modules.

All analysers must have an argument for JSON file with analysis results. If you run code report independently, the name must conform to file name standards.

Running analysers from Universum config, you need to add code_report=True and result file argument mandatory must be set to "${CODE_REPORT_FILE}". "${CODE_REPORT_FILE}" is a pseudo-variable that will be replaced with the file name during execution. Also, without code_report=True and result file may be called any name, as it won’t be processed according to the rules defined for analysers. Such step will be marked as Failed if any analysis issues are found.

Do note that you can also directly submit results generated by static analyzers, which are not supported by the Universum. Provided data shall be parsed and found issues shall be processed and reported, given that file conforms to the following pylint-like json schema:

"issues": {
    "type": "array",
    "items": {
        "type": "object",
        "required": [ "path", "line", "message", "symbol" ],
        "properties": {
            "path": { "type": "string" },
            "line": { "type": "number" },
            "message": { "type": "string" },
            "symbol": {  "type": "string" }
        }
    }
}

Alternatively, report file can conform to SARIF schema: https://docs.oasis-open.org/sarif/sarif/v2.0/sarif-v2.0.html To provide such report directly, you need to place/copy the pre-formatted file in "${CODE_REPORT_FILE}" location.

from universum.configuration_support import Configuration, Step

configs = Configuration([Step(name="Direct report", code_report=True, report_artifacts='${CODE_REPORT_FILE}',
  command=f"cp /my_path/my_report.json ${{CODE_REPORT_FILE}}")])

Note

When using Universum, if a file with analysis results is not added to artifacts, it will be deleted along with other build sources and results.

When using via Universum code_report=True step, use --report-to-review functionality to comment on any found issues to code review system.

Pylint

Pylint analyzer

usage: python3.7 -m universum.analyzers.pylint [-h] [--rcfile RCFILE]
                                               [--python-version VERSION]

Named Arguments

--rcfile

Specify a configuration file.

--python-version

Version of the python interpreter, such as 2, 3 or 3.7. Pylint analyzer uses this parameter to select python binary for launching pylint. For example, if the version is 3.7, it uses the following command: ‘python3.7 -m pylint <…>’

Default: “3”

Config example for universum.analyzers.pylint:

from universum.configuration_support import Configuration, Step

configs = Configuration([Step(name="pylint", code_report=True, command=[
    "python3.7", "-m", "universum.analyzers.pylint", "--python-version", "2.7",
    "--result-file", "${CODE_REPORT_FILE}", "--files", "*.py", "examples/"
])])

if __name__ == '__main__':
    print(configs.dump())

This file will get us the following list of configurations:

$ ./.universum.py
[{'name': 'pylint', 'code_report': True, 'command': 'python3.7 -m universum.analyzers.pylint --python-version 2.7 --result-file ${CODE_REPORT_FILE} --files *.py examples/'}]

Mypy

Mypy analyzer

usage: python3.7 -m universum.analyzers.mypy [-h] [--config-file CONFIG_FILE]
                                             [--python-version VERSION]

Named Arguments

--config-file

Specify a configuration file.

--python-version

Version of the python interpreter, such as 2, 3 or 3.7. Pylint analyzer uses this parameter to select python binary for launching pylint. For example, if the version is 3.7, it uses the following command: ‘python3.7 -m pylint <…>’

Default: “3”

Config example for universum.analyzers.mypy:

from universum.configuration_support import Configuration, Step

configs = Configuration([Step(name="mypy", code_report=True, command=[
    "python3.7", "-m", "universum.analyzers.mypy", "--python-version", "3",
    "--result-file", "${CODE_REPORT_FILE}", "--files", "*.py", "examples/"
])])

if __name__ == '__main__':
    print(configs.dump())

This file will get us the following list of configurations:

$ ./.universum.py
[{'name': 'mypy', 'code_report': True, 'command': 'python3.7 -m universum.analyzers.mypy --python-version 3 --result-file ${CODE_REPORT_FILE} --files *.py examples/'}]

Uncrustify

Uncrustify analyzer

usage: python3.7 -m universum.analyzers.uncrustify [-h] [--cfg-file CFG_FILE]
                                                   [--output-directory OUTPUT_DIRECTORY]
                                                   [--report-html]

Named Arguments

--cfg-file, -cf

Name of the configuration file of Uncrustify; can also be set via ‘UNCRUSTIFY_CONFIG’ env. variable

--output-directory, -od

Directory to store fixed files, generated by Uncrustify and HTML files with diff; the default value is ‘uncrustify’Has to be distinct from source directory

--report-html

(optional) Set to generate html reports for each modified file

Config example for universum.analyzers.uncrustify:

from universum.configuration_support import Configuration, Step

configs = Configuration([Step(name="uncrustify", code_report=True, command=[
    "python3.7", "-m", "universum.analyzers.uncrustify",  "--files", "/home/user/workspace/temp",
    "--cfg-file", "file_name.cfg", "--result-file", "${CODE_REPORT_FILE}", "--output-directory", "uncrustify"
])])

if __name__ == '__main__':
    print(configs.dump())

will produce this list of configurations:

$ ./.universum.py
[{'name': 'uncrustify', 'code_report': True, 'command': 'python3.7 -m universum.analyzers.uncrustify --files /home/user/workspace/temp --cfg-file file_name.cfg --result-file ${CODE_REPORT_FILE} --output-directory uncrustify'}]