165 lines
5.2 KiB
Python
165 lines
5.2 KiB
Python
#!/usr/bin/python
|
|
|
|
import sys
|
|
|
|
import os
|
|
from os import path
|
|
|
|
import io
|
|
import itertools as IT
|
|
import xml.etree.ElementTree as ET
|
|
|
|
import platform
|
|
|
|
LEVEL_SUCCESS = 0
|
|
LEVEL_WARNING = 1
|
|
LEVEL_ERROR = 2
|
|
|
|
# Queries examples:
|
|
# https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Fend2endzone%2Ffa6f6ec2f8315e357405164b4d618ef4%2Fraw%2Fafe1c3be748e7a78bc905c322afbd9a24f1e328e%2Fmybadge.json
|
|
# https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Fend2endzone%2Ffa6f6ec2f8315e357405164b4d618ef4%2Fraw%2F5df297ffc360897097974338d4d43ef69271831b%2Fmybadge.json
|
|
# https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Fend2endzone%2Ffa6f6ec2f8315e357405164b4d618ef4%2Fraw%2Fmybadge.json
|
|
|
|
def getNamedLogo():
|
|
# Search the running CI/CD service from environment variables
|
|
namedLogo = ""
|
|
if os.getenv('APPVEYOR', "") != "":
|
|
namedLogo = "AppVeyor"
|
|
elif os.getenv('TRAVIS', "") != "":
|
|
namedLogo = "Travis CI"
|
|
elif os.getenv('JENKINS_URL', "") != "":
|
|
namedLogo = "Jenkins"
|
|
elif os.getenv('GITHUB_ACTIONS', "") != "":
|
|
if os.getenv('RUNNER_OS', "") == "macOS":
|
|
namedLogo = "Apple"
|
|
elif os.getenv('RUNNER_OS', "") == "Linux":
|
|
namedLogo = "Linux"
|
|
elif os.getenv('RUNNER_OS', "") == "Windows":
|
|
namedLogo = "Windows"
|
|
else:
|
|
namedLogo = "GitHub"
|
|
elif platform.system() == "Darwin":
|
|
namedLogo = "Apple"
|
|
elif platform.system() == "Linux":
|
|
namedLogo = "Linux"
|
|
elif platform.system() == "Windows":
|
|
namedLogo = "Windows"
|
|
return namedLogo
|
|
|
|
def getColorFromLevel(level):
|
|
color = ""
|
|
if level == LEVEL_SUCCESS:
|
|
color = "Green"
|
|
elif level == LEVEL_WARNING:
|
|
color = "Orange"
|
|
else:
|
|
color = "Red"
|
|
return color
|
|
|
|
def main():
|
|
print("maketestbadge v1.1")
|
|
|
|
# Validate input file
|
|
if len(sys.argv) == 2:
|
|
file_path = sys.argv[1]
|
|
else:
|
|
print("Create endpoint badge json files from junit report. See https://shields.io/endpoint for details.")
|
|
print("Missing input file. Please specify a path to a junit report.")
|
|
sys.exit(1);
|
|
if not path.isfile(file_path) or not path.exists(file_path):
|
|
print("File not found: " + file_path)
|
|
sys.exit(1);
|
|
|
|
print("Creating badge from junit report '" + file_path + "' for https://shields.io/endpoint")
|
|
|
|
# Parse the content of the file
|
|
try:
|
|
tree = ET.parse(file_path)
|
|
except ET.ParseError as err:
|
|
lineno, column = err.position
|
|
err.msg = "Failed parsing file at line=" + str(lineno) + ", column=" + str(column) + "."
|
|
#raise
|
|
print(err.msg)
|
|
sys.exit(1);
|
|
root = tree.getroot()
|
|
|
|
# Find the important attributes
|
|
#testsuites = root.find('./testsuite')
|
|
try:
|
|
tests_count = root.attrib['tests']
|
|
failures_count = root.attrib['failures']
|
|
disabled_count = root.attrib['disabled']
|
|
except KeyError as err:
|
|
err.msg = "Failed to find count of tests, failures or disabled values."
|
|
#raise
|
|
print(err.msg)
|
|
sys.exit(1);
|
|
tests_count = int(tests_count )
|
|
failures_count = int(failures_count)
|
|
disabled_count = int(disabled_count)
|
|
success_count = tests_count - failures_count - disabled_count
|
|
print("Found " + str(tests_count) + " tests: " + str(success_count) + " success, " + str(failures_count) + " failures and " + str(disabled_count) + " disabled tests.")
|
|
|
|
# Evaluate badge properties
|
|
# badge_level
|
|
if failures_count == 0:
|
|
badge_level = LEVEL_SUCCESS
|
|
elif failures_count == 1:
|
|
badge_level = LEVEL_WARNING
|
|
else:
|
|
badge_level = LEVEL_ERROR
|
|
|
|
# badge_color, a.k.a message color
|
|
if badge_level == LEVEL_SUCCESS:
|
|
badge_color = "#4c1" #brightgreen
|
|
elif badge_level == LEVEL_WARNING:
|
|
badge_color = "#fe7d37" #orange
|
|
else:
|
|
badge_color = "#e05d44" #red
|
|
|
|
# badge_message
|
|
if badge_level == LEVEL_SUCCESS:
|
|
badge_message = str(success_count) + " passed"
|
|
elif badge_level == LEVEL_WARNING:
|
|
badge_message = str(failures_count) + " failed"
|
|
else:
|
|
badge_message = str(failures_count) + " failed"
|
|
#if disabled_count > 0:
|
|
# badge_message = badge_message + ", " + str(disabled_count) + " disabled"
|
|
|
|
# other
|
|
badge_schemaVersion = 1
|
|
badge_label = "tests"
|
|
#badge_labelColor = "#5c5c5c"
|
|
badge_namedLogo = getNamedLogo()
|
|
badge_logoColor = "white"
|
|
|
|
print("Creating badge: " + badge_namedLogo + ", " + getColorFromLevel(badge_level).lower() + ", " + badge_message)
|
|
|
|
relative_path = "badge.json"
|
|
full_path = os.path.realpath(relative_path)
|
|
|
|
# Save as badge.json
|
|
try:
|
|
text_file = open(full_path, "w")
|
|
text_file.write("{\n")
|
|
text_file.write(" \"schemaVersion\": {0},\n".format(badge_schemaVersion))
|
|
text_file.write(" \"namedLogo\": \"{0}\",\n".format(badge_namedLogo))
|
|
text_file.write(" \"logoColor\": \"{0}\",\n".format(badge_logoColor))
|
|
text_file.write(" \"label\": \"{0}\",\n".format(badge_label))
|
|
#text_file.write(" \"labelColor\": \"{0}\",\n".format(badge_labelColor))
|
|
text_file.write(" \"color\": \"{0}\",\n".format(badge_color))
|
|
text_file.write(" \"message\": \"{0}\"\n".format(badge_message))
|
|
text_file.write("}\n")
|
|
text_file.close()
|
|
except OSError as err:
|
|
err.msg = "Failed to save badge.json."
|
|
#raise
|
|
print(err.msg)
|
|
sys.exit(1);
|
|
|
|
print("Saved badge as " + full_path)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|