.. _Custom Report Predefined Templates:

Custom Report Predefined Templates
----------------------------------


FAILURES_TEXT
~~~~~~~~~~~~~

This predefined template can be used to generate a custom report containing the linting failures in the same format as the output of verissimo.sh

.. code-block:: 

    <#if (linter.getHits()?size > 0)>
    <#list linter.getHits() as hit>
    *** LINT ${hit.getSeverity()} ${hit.getCheck().getName()}: ${hit.getDetails()} at line: ${hit.getLine()} in file: ${hit.getFile()}
    </#list>
    </#if>


FAILURES_JSON
~~~~~~~~~~~~~

This template can be used to generate a custom report containing the linting failures in a JSON format.

.. code-block::

    <#function toJSON x>
        <#return x?json_string?replace("'","\\'")?replace("/","\\/")>
    </#function>
    {
    "hits": [
    <#list linter.getHits() as hit>
    {
    "categoryName":"${hit.getCheck().getCategory()}",
    "checkName":"${hit.getCheck().getName()}",
    "checkTitle":"'${toJSON(hit.getCheck().getTitle())}'",
    "severity":"${hit.getSeverity()}",
    "message":"'${toJSON(hit.getDetails())}'",
    "line":"${hit.getLine()}",
    "file":"${hit.getFile()}",
    }<#sep>,</#sep>
    </#list>
    ]
    }


FAILURES_XML
~~~~~~~~~~~~

This template can be used to generate a custom report containing the linting failures in a XML format.

.. code-block::

    <report>
    <#if (linter.getChecks()?size > 0)>
    <#assign printedCategory = linter.getChecks()?first.getCategory()>
    <category name="${printedCategory}">
    <#list linter.getChecks() as check>
    <#if printedCategory != check.getCategory()>
    <#assign printedCategory = check.getCategory()>
    </category>
    <category name="${printedCategory}">
    </#if>
    <#if (check.getHits()?size > 0)>
    <check name="${check.getName()}" title="${check.getTitle()?xml}">
    <#list check.getHits() as hit>
    <severity="${hit.getSeverity()}" details="${hit.getDetails()?xml}" line="${hit.getLine()}" file="${hit.getFile()}" />
    </#list>
    </check>
    <#else>
    <check name="${check.getName()}" title="${check.getTitle()?xml}"/>
    </#if>
    </#list>
    </category>
    </#if>
    </report>


LINTED_FILES_TEXT
~~~~~~~~~~~~~~~~~

This template can be used to generate a custom report containing the list of files analyzed by Verissimo.

.. code-block::

    <#list linter.getFiles() as file>
    <#if file.isPreWaivedFor("ALL_CHECKS") != "true" && file != "none">
    ${file.getName()}
    </#if>
    </#list>


AUTOCORRECT_EDITS_TEXT
~~~~~~~~~~~~~~~~~~~~~~

This template can be used to generate a custom report containing the edits performed by auto-correct as well as the failures that could not be auto-corrected.

.. code-block::

    File Edits:
    ID / File / Line / Edit Type / File Offset / Edit Length / Edit Content
    <#list linter.getFiles() as file>
        <#list file.getAutocorrectEdits() as edit>
    ${edit.getCheck().getId()} / ${file.getName()} / ${edit.getLine()?long?c} / ${edit.getType()} / ${edit.getFileOffset()?long?c} / ${edit.getLength()} / ${edit.getContent()}
        </#list>
    </#list>
    
    
    Failures that could not be autocorrected:
    ID / File / Line / Reason
    <#list linter.getFiles() as file>
        <#list file.getAutocorrectErrors() as error>
    ${error.getHit().getCheck().getId()} / ${file.getName()} / ${error.getHit().getLine()} / ${error.getReason()}
        </#list>
    </#list>


WAIVED_FAILURES_CSV
~~~~~~~~~~~~~~~~~~~

This template can be used to generate a custom report containing the failures that have been affected by waivers in a comma separated format.

.. code-block::

    Rule Id,Rule Name,Rule Title,Waiver Comment,File Name,File Path,Line Number
    ,,,,,
    <#list linter.getWaivers() as waiver>
    <#list waiver.getWaivedFailures() as hit>
    <#assign check = hit.getCheck()>
    "${check.getId()}", "${check.getName()}", "${check.getTitle()}","${waiver.getDescription()}", "${hit.getFile()?substring(hit.getFile()?last_index_of("/"))}", "${hit.getFile()}",${hit.getLine()} 
    </#list>
    </#list>


AVAILABLE_CHECKS_CSV
~~~~~~~~~~~~~~~~~~~~

This template can be used to generate a custom report containing a list of all the checks that have been run. Running verissimo.sh with the following command:

.. code-block::

 verissimo.sh -cmd /path/to/empty_file -all -gen_custom_report AVAILABLE_CHECKS_CSV 

will generate a custom report containing all of the available Verissimo rules in a CSV format.

.. code-block::

 Category,Rule Id,Rule Name,Rule Title,Rule Description,Supports Autocorrect
 ,,,,,
 <#assign checkCategory = "">
 <#list linter.getChecks() as check>
 <#if check.getCategory() != checkCategory>
 "${check.getCategory()}",,,,
 <#assign checkCategory = check.getCategory()>
 </#if>
 ,"${check.getId()}","${check.getName()}","${check.getTitle()}","${check.getDescription()?replace("\"","'")}","${check.isAutocorrectable()?c}"
 </#list>


PERFORMANCE_STATS_TEXT
~~~~~~~~~~~~~~~~~~~~~~

This predefined template can be used to generate a custom report containing performance statistics related to the build and linting processes. 

.. code-block:: 

    Linter version: ${linter.getVersion()}

    Build phase:

    Total number of compiled lines: ${linter.getNofCompiledLines()?c}
    Total build time: ${linter.getBuildRunTime()?c} ms

    Linting phase:

    ID / Name / Hits / Run time
    <#list linter.getChecks() as check>
    ${check.getId()} / ${check.getName()} / ${check.getHits()?size?c} hits / ${check.getRunTime()?c} ms
    </#list>

    Total hits count: ${linter.getHits()?size?c} hits
    Total linting time: ${linter.getLintRunTime()?c} ms
