Source code for axiom.report

"""Reporting functions."""
from tabulate import tabulate
from axiom import __version__


def _is_missing(e):
    """Check if error was for a missing attribute.

    Args:
        e (cerberus.errors.ValidationError): Error object.

    Returns:
        bool: True/False
    """
    return isinstance(e.constraint, bool) and e.constraint == True and e.value == None


def _is_incorrect_type(e):
    """Check if error was for an incorrect attribute data type.

    Args:
        e (cerberus.errors.ValidationError): Error object.

    Returns:
        bool: True/False
    """
    return e.schema_path[-1] == 'type'


def _is_incorrect_value(e):
    """Check if error was for an incorrect attribute value.

    Args:
        e (cerberus.errors.ValidationError): Error object.

    Returns:
        bool: True/False
    """
    return e.schema_path[-1] == 'allowed'


[docs]def generate_report(validator, input_filepath, report_filepath): """Generate a report for a validator. Args: validator (axiom.validation.Validator): Validator object. input_filepath (str) : Path to the file that was validated. report_filepath (str): Path to which to write the report. """ # Create the headings and lines array table_heading = ['Variable', 'Attribute', 'Error'] table_lines = list() # Global errors for e in validator.errors['_global']: variable = '_global' attribute = e.document_path[0] # Attribute missing if _is_missing(e): error = 'Attribute is missing' # Incorrect type elif _is_incorrect_type(e): expected_type = e.constraint error = f'Incorrect type, should be {expected_type}' else: error = 'Unknown error' table_lines.append([variable, attribute, error]) # Errors per variable for key, errors in validator.errors['variables'].items(): variable = key for e in errors: attribute = e.document_path[0] # Missing if _is_missing(e): error = "Attribute is missing." # Incorrect type elif _is_incorrect_type(e): expected_type = e.constraint error = f'Incorrect type, should be {expected_type}' # Incorrect value elif _is_incorrect_value(e): allowed_values = ','.join(e.constraint) error = f'Incorrect value, must be one of {allowed_values}' else: error = 'Unknown error' line = [variable, attribute, error] table_lines.append(line) # Tabulate reults table = tabulate(table_lines, table_heading, tablefmt='grid') # Determine the status status = 'PASSED' if validator.is_valid else 'FAILED' # Generate the heading. lines = list() lines.append(f'Axiom Validator {__version__}') lines.append(f'Report generated: {validator.date_validated}') lines.append(f'schema_filepath: {validator.schema_filepath}') lines.append(f'input_filepath: {input_filepath}') lines.append(f'Status: {status}\n') # Put it all together and dump to file content = '\n'.join(lines) content = content + table + '\n' open(report_filepath, 'w').write(content)