[391107] Sorting of commit configdocs results

Sorts Errors > Warnings > Info in results returned. Adds the
source of the error if known.

Change-Id: I2d449bc4f999909fe84b10686fdb8e3c7d5fcd5f
This commit is contained in:
Bryan Strassner 2018-03-17 15:03:55 -05:00 committed by Scott Hussey
parent 84f161121d
commit db5f22d34e
2 changed files with 102 additions and 28 deletions

View File

@ -17,6 +17,8 @@ import yaml
from prettytable import PrettyTable
from prettytable.prettytable import PLAIN_COLUMNS
_INDENT = ' ' * 8
def cli_format_error_handler(response):
"""Generic handler for standard Shipyard error responses
@ -54,40 +56,26 @@ def cli_format_status_handler(response, is_error=False):
"""
formatted = "Error: {}\nReason: {}" if is_error \
else "Status: {}\nReason: {}"
indent = ' ' * 8
try:
if response.text:
resp_j = response.json()
resp = formatted.format(resp_j.get('message', 'Not specified'),
resp_j.get('reason', 'Not specified'))
if resp_j.get('details'):
for message in resp_j.get('details').get('messageList', []):
mlist = resp_j['details'].get('messageList', [])
for message in sorted(mlist,
key=lambda m: _lvl_key(
m.get('level'),
m.get('error', False))):
if message.get('kind') == 'ValidationMessage':
resp = resp + '\n- {}: {}'.format(
message.get('level'),
message.get('name')
)
resp = resp + '\n{}Message: {}'.format(
indent,
message.get('message')
)
if message.get('diagnostic'):
resp = resp + '\n{}Diagnostic: {}'.format(
indent, message.get('diagnostic')
)
for doc in message.get('documents', []):
resp = resp + '\n{}Document: {} - {}'.format(
indent,
doc.get('schema'),
doc.get('name')
)
resp = resp + _format_validation_message(message)
else:
if message.get('error', False):
resp = resp + '\n- Error: {}'.format(
message.get('message'))
else:
resp = resp + '\n- Info: {}'.format(
message.get('message'))
resp = resp + _format_basic_message(message)
if message.get('source'):
resp = resp + "\n{}Source: {}".format(
_INDENT,
message['source']
)
return resp
else:
return ''
@ -96,6 +84,69 @@ def cli_format_status_handler(response, is_error=False):
response.text)
# Map of levels by severity. Extra values are included in this map but valid
# values are defined here:
# https://github.com/att-comdev/ucp-integration/blob/master/docs/source/api-conventions.rst#validationmessage-message-type
_LEVEL_KEYS = {
0: ['error', 'fatal'],
1: ['warn', 'warning'],
2: ['info', 'debug'],
}
_SENTINEL_LEVEL = "999"
def _lvl_key(level_name, error):
"""Generate a level key value
Returns a value to support sort order based on lvls dict.
The result is that like-level items are sorted together.
"""
if level_name is None:
if (error):
level_name = 'error'
else:
level_name = 'info'
else:
level_name = level_name.lower()
for key, val_list in _LEVEL_KEYS.items():
if level_name in val_list:
return '{}{}'.format(key, level_name)
return _SENTINEL_LEVEL
def _format_validation_message(message):
"""Formats a ValidationMessage
Returns a single string with embedded newlines
"""
resp = '\n- {}: {}'.format(message.get('level'), message.get('name'))
resp = resp + '\n{}Message: {}'.format(_INDENT, message.get('message'))
if message.get('diagnostic'):
resp = resp + '\n{}Diagnostic: {}'.format(
_INDENT, message.get('diagnostic')
)
for doc in message.get('documents', []):
resp = resp + '\n{}Document: {} - {}'.format(
_INDENT,
doc.get('schema'),
doc.get('name')
)
return resp
def _format_basic_message(message):
"""Formats a basic message
Returns a single string with embedded newlines
"""
if message.get('error', False):
resp = '\n- Error: {}'.format(message.get('message'))
else:
resp = '\n- Info: {}'.format(message.get('message'))
return resp
def raw_format_response_handler(response):
"""Basic format handler to return raw response text"""
return response.text

View File

@ -130,7 +130,8 @@ def test_cli_format_error_handler_messages_broken():
def test_cli_format_status_handler_messages():
"""Tests the generic handler for shipyard status response if passed
a response with messages in the detail
a response with messages in the detail. Includes sorting and source
information.
"""
resp_val = """
{
@ -142,6 +143,18 @@ def test_cli_format_status_handler_messages():
"details": {
"errorCount": 4,
"messageList": [
{ "message":"Info something you might want to know",
"error": false,
"kind": "ValidationMessage",
"name": "val0",
"documents": [
{ "schema": "schema/schema/v1",
"name": "someyaml"
}
],
"level": "Info",
"source": "format-o-matic"
},
{ "message":"Conflicting something",
"error": true,
"kind": "ValidationMessage",
@ -154,6 +167,10 @@ def test_cli_format_status_handler_messages():
"level": "Error",
"diagnostic": "Make a doc change"
},
{ "message": "Basic info",
"error": false,
"source": "Armadadock"
},
{ "message":"Backwards something",
"error": true,
"kind": "ValidationMessage",
@ -185,7 +202,13 @@ Reason: Validation
- Error: val2
Message: Backwards something
- Error: Missing stuff
- Error: Broken syntax"""
- Error: Broken syntax
- Info: val0
Message: Info something you might want to know
Document: schema/schema/v1 - someyaml
Source: format-o-matic
- Info: Basic info
Source: Armadadock"""
resp = MagicMock()
resp.json = MagicMock(return_value=json.loads(resp_val))
output = format_utils.cli_format_status_handler(resp, is_error=True)