summary.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. class SummaryItem(object):
  2. def __init__(self, data):
  3. self.line = data.get('line', None)
  4. self.repository = data.get('repository', None)
  5. self.commit_id = data.get('commit', None)
  6. self.exc = data.get('exc', None)
  7. self.image_id = data.get('id', None)
  8. self.source = data.get('source', None)
  9. self.tag = data.get('tag', None)
  10. class Summary(object):
  11. def __init__(self):
  12. self._summary = {}
  13. self._has_exc = False
  14. def _add_data(self, image, linestr, data):
  15. linestr = linestr.strip('\n')
  16. parts = linestr.split()
  17. tag = 'latest'
  18. source = None
  19. if len(parts) == 1:
  20. source = linestr + '@B:master'
  21. elif len(parts) == 2:
  22. tag = parts[0]
  23. source = parts[1] + '@B:master'
  24. elif len(parts) == 3:
  25. tag = parts[0]
  26. source = '{}@{}'.format(parts[1], parts[2])
  27. data.tag = tag
  28. data.source = source
  29. if image not in self._summary:
  30. self._summary[image] = {linestr: data}
  31. else:
  32. self._summary[image][linestr] = data
  33. def add_exception(self, image, line, exc, commit=None):
  34. lineno, linestr = line
  35. self._add_data(image, linestr, SummaryItem({
  36. 'line': lineno,
  37. 'exc': str(exc),
  38. 'repository': image,
  39. 'commit': commit
  40. }))
  41. self._has_exc = True
  42. def add_success(self, image, line, img_id, commit=None):
  43. lineno, linestr = line
  44. self._add_data(image, linestr, SummaryItem({
  45. 'line': lineno,
  46. 'id': img_id,
  47. 'repository': image,
  48. 'commit': commit
  49. }))
  50. def print_summary(self, logger=None):
  51. linesep = ''.center(61, '-') + '\n'
  52. s = 'BREW BUILD SUMMARY\n' + linesep
  53. success = 'OVERALL SUCCESS: {}\n'.format(not self._has_exc)
  54. details = linesep
  55. for image, lines in self._summary.iteritems():
  56. details = details + '{}\n{}'.format(image, linesep)
  57. for linestr, data in lines.iteritems():
  58. details = details + '{0:2} | {1} | {2:50}\n'.format(
  59. data.line,
  60. 'KO' if data.exc else 'OK',
  61. data.exc or data.image_id
  62. )
  63. details = details + linesep
  64. if logger is not None:
  65. logger.info(s + success + details)
  66. else:
  67. print s, success, details
  68. def exit_code(self):
  69. return 1 if self._has_exc else 0
  70. def items(self):
  71. for lines in self._summary.itervalues():
  72. for item in lines.itervalues():
  73. yield item