Skip to content

Commit 9963bea

Browse files
committed
feat: v3 release report
1 parent 8665db3 commit 9963bea

11 files changed

+244
-1
lines changed

generate-report-v3.py

+211
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
#!/usr/bin/python
2+
3+
import sys
4+
from operator import attrgetter
5+
from csv import reader
6+
from datetime import datetime
7+
from report.run import Run
8+
from report.commit import Commit
9+
from report.language import Language
10+
import chevron
11+
12+
timestamp = None
13+
default_folders_location = "https://github.com/swagger-api/swagger-codegen-test/tree/main/out"
14+
15+
def multisort(xs, specs):
16+
for key, reverse in reversed(specs):
17+
xs.sort(key=attrgetter(key), reverse=reverse)
18+
return xs
19+
20+
def deserializeRun(row):
21+
row_content = row[0]
22+
cells = row_content.split('|')
23+
24+
run = Run()
25+
run.v2_version = cells[0]
26+
run.v3_version = cells[1]
27+
run.codegen_version = cells[2]
28+
run.timestamp = datetime.strptime(cells[3], "%Y_%m_%d_%H_%M_%S")
29+
run.commit = cells[4]
30+
run.language = cells[5]
31+
run.job = cells[6]
32+
run.spec = cells[7]
33+
run.generate_outcome = cells[8]
34+
run.build_outcome = cells[9]
35+
run.spec_url = cells[10]
36+
run.is_success_generation = run.generate_outcome == "success"
37+
timestamp = run.timestamp.strftime("%Y_%m_%d_%H_%M_%S")
38+
run.generated_folder_link = default_folders_location + "/" + run.v2_version + "_" + run.v3_version + "/" + timestamp + "/" + run.language + "/" + run.job + "/" + run.spec
39+
return run
40+
41+
42+
def generateReport(outFolder, newestSpecV3, oldestSpecV3):
43+
global timestamp
44+
results_file = open(outFolder + "results.csv", "r")
45+
csv_reader = reader(results_file)
46+
47+
index = 0
48+
49+
suitesMap = dict()
50+
51+
# iterate all runs
52+
for row in csv_reader:
53+
# skip header
54+
if index == 0:
55+
index = index + 1
56+
continue
57+
# get run
58+
run = deserializeRun(row)
59+
# identify "commit" (todo rename to suite) by timestamp
60+
if run.timestamp in suitesMap: # exists
61+
commit = suitesMap[run.timestamp]
62+
else: # doesn't exist, create
63+
commit = Commit()
64+
commit.languagesv2 = dict()
65+
commit.languagesv3 = dict()
66+
commit.commit = run.commit
67+
commit.short_hash = commit.commit[0:7]
68+
commit.timestamp = run.timestamp
69+
commit.v2_version = run.v2_version
70+
commit.v3_version = run.v3_version
71+
commit.runs = list()
72+
# add to suiteMap
73+
suitesMap[run.timestamp] = commit
74+
75+
# append the current run to suite
76+
commit.runs.append(run)
77+
languagev2 = None
78+
languagev3 = None
79+
# setup languages for each suite
80+
if run.codegen_version == "v3":
81+
run.isV2 = False
82+
if run.language in commit.languagesv3: # use existing
83+
languagev3 = commit.languagesv3[run.language]
84+
else: # create new
85+
languagev3 = Language()
86+
languagev3.codegen_version = run.codegen_version
87+
languagev3.name = run.language
88+
commit.languagesv3[run.language] = languagev3
89+
languagev3.total_runs += 1
90+
else:
91+
run.isV2 = True
92+
index = index + 1
93+
continue
94+
index += 1
95+
# sort by timestamp ascending
96+
suitesKeys = sorted(suitesMap.keys(), reverse = False)
97+
# suitesMap = dict(sorted(suitesMap.items(), None, True))
98+
# commits = sorted(commits, key=lambda sortCommit: sortCommit.timestamp)
99+
100+
# todo now we mandate all 4 parameters, checking only the first
101+
suiteNew = None
102+
suiteOld = None
103+
104+
for suiteKey in suitesKeys:
105+
commit = suitesMap[suiteKey]
106+
print (str(suiteKey) + " " + commit.v2_version + " " + commit.v3_version)
107+
# todo we should be able to run probably separately v2 and v3 to be able to run and compare separately..
108+
if commit.v3_version == newestSpecV3:
109+
suiteNew = commit
110+
if commit.v3_version == oldestSpecV3:
111+
suiteOld = commit
112+
suitesMapFiltered = dict()
113+
suitesMapFiltered[suiteOld.timestamp] = suiteOld
114+
suitesMapFiltered[suiteNew.timestamp] = suiteNew
115+
suitesMap = suitesMapFiltered
116+
suitesKeys = suitesMap.keys()
117+
118+
previous_commit = None
119+
for suiteKey in suitesKeys:
120+
commit = suitesMap[suiteKey]
121+
commit.runs = multisort(list(commit.runs), (('codegen_version', False), ('language', False)))
122+
commit.total_runs = len(commit.runs)
123+
124+
for run in commit.runs:
125+
previous_run = None
126+
if run.codegen_version != "v3":
127+
continue
128+
if previous_commit is not None:
129+
previous_run = run.find_match(previous_commit.runs)
130+
if run.generate_outcome != "success":
131+
run.generate_error = True
132+
commit.generate_error_count += 1
133+
if run.codegen_version == "v3":
134+
if run.language in commit.languagesv3: # use existing
135+
commit.languagesv3[run.language].generate_error_count += 1
136+
if previous_run is not None:
137+
if previous_run.generate_outcome == "success":
138+
commit.regression_count += 1
139+
run.is_regression = True
140+
if run.codegen_version == "v3":
141+
if run.language in commit.languagesv3: # use existing
142+
commit.languagesv3[run.language].regression_count += 1
143+
if run.build_outcome != "success":
144+
run.build_error = True
145+
if run.build_outcome == "failure":
146+
commit.build_failure_count += 1
147+
if run.codegen_version == "v3":
148+
if run.language in commit.languagesv3:
149+
commit.languagesv3[run.language].build_failure_count += 1
150+
if previous_run is not None:
151+
if previous_run.build_outcome == "success":
152+
commit.regression_count += 1
153+
run.is_regression = True
154+
if run.codegen_version == "v3":
155+
if run.language in commit.languagesv3:
156+
commit.languagesv3[run.language].regression_count += 1
157+
else:
158+
commit.build_error_count += 1
159+
if run.codegen_version == "v3":
160+
if run.language in commit.languagesv3: # use existing
161+
commit.languagesv3[run.language].build_error_count += 1
162+
if previous_run is not None:
163+
if previous_run.build_outcome == "success":
164+
commit.regression_count += 1
165+
run.is_regression = True
166+
if run.codegen_version == "v3":
167+
if run.language in commit.languagesv3: # use existing
168+
commit.languagesv3[run.language].regression_count += 1
169+
else:
170+
if run.codegen_version == "v3" and run.language in commit.languagesv3:
171+
commit.languagesv3[run.language].successful_runs += 1
172+
173+
previous_commit = commit
174+
175+
# sort by timestamp descending
176+
if newestSpecV3 is None:
177+
suitesKeys = sorted(suitesMap.keys(), reverse = True)
178+
else:
179+
suitesMapFiltered = dict()
180+
suitesMapFiltered[suiteNew.timestamp] = suiteNew
181+
suitesMapFiltered[suiteOld.timestamp] = suiteOld
182+
suitesMap = suitesMapFiltered
183+
suitesKeys = suitesMap.keys()
184+
185+
commits = list()
186+
for suiteKey in suitesKeys:
187+
print ("SUITE " + str(suiteKey))
188+
commit = suitesMap[suiteKey]
189+
langKeysv3 = sorted(commit.languagesv3.keys(), reverse = False)
190+
langsv3 = list()
191+
for langKeyv3 in langKeysv3:
192+
langsv3.append(commit.languagesv3[langKeyv3])
193+
commit.languagesv3 = multisort(list(langsv3), (('codegen_version', False), ('name', False)))
194+
commits.append(commit)
195+
196+
with open('indexmdv3.mustache', 'r') as template:
197+
output = chevron.render(template, {'commits': commits})
198+
file = outFolder + "reportV3Release_" + newestSpecV3 + "_" + oldestSpecV3 + "_" + timestamp + ".md"
199+
result_file = open(file, "wt")
200+
result_file.write(output)
201+
result_file.close()
202+
203+
# main
204+
def main():
205+
global timestamp
206+
207+
timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
208+
generateReport("out/", sys.argv[1], sys.argv[2])
209+
210+
# here start main
211+
main()

indexmdv3.mustache

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Codegen Release Report V3
2+
{{#commits}}
3+
4+
## Version Report For {{v3_version}} {{timestamp}}
5+
#### [{{short_hash}}](https://github.com/swagger-api/swagger-codegen/commit/{{commit}})
6+
#### [{{short_commit}}](https://github.com/swagger-api/swagger-codegen/commit/{{commit}})
7+
|||
8+
|-|-|
9+
|Total runs:|{{total_runs}}|
10+
|Build errors:|***{{build_error_count}}***|
11+
|Build failures:|***{{build_failure_count}}***|
12+
|Generate errors:| ***{{generate_error_count}}***|
13+
|Regressions:|***{{regression_count}}***|
14+
15+
### Languages
16+
17+
|Version|Language|Runs|Successful Runs|Gen Errors|Build Errors|Build Failures|Regressions|
18+
|-|-|-|-|-|-|-|-|
19+
{{#languagesv3}}
20+
|{{codegen_version}}|{{name}}|{{total_runs}}|{{successful_runs}}|{{generate_error_count}}|{{build_error_count}}|{{build_failure_count}}|{{regression_count}}|
21+
{{/languagesv3}}
22+
23+
### Runs
24+
|Version|Language|Codegen Version|Job|Spec|Generate Outcome|Build Outcome|Generated Folder|
25+
|-|-|-|-|-|-|-|-|
26+
{{#runs}}
27+
{{^isV2}}
28+
|{{codegen_version}}|{{language}}|{{v3_version}}|{{job}}|[{{spec}}]({{spec_url}})|{{#generate_error}}***{{/generate_error}}{{generate_outcome}}{{#generate_error}}***{{/generate_error}}|{{#is_regression}}***REGRESSION {{build_outcome}}***{{/is_regression}}{{^is_regression}}{{#build_error}}***{{/build_error}}{{build_outcome}}{{#build_error}}***{{/build_error}}{{/is_regression}}|{{#is_success_generation}}[View]({{generated_folder_link}}){{/is_success_generation}}|
29+
{{/isV2}}
30+
{{/runs}}
31+
{{/commits}}

report/__init__.pyc

-162 Bytes
Binary file not shown.
-158 Bytes
Binary file not shown.
-817 Bytes
Binary file not shown.
-704 Bytes
Binary file not shown.

report/__pycache__/run.cpython-35.pyc

-1.14 KB
Binary file not shown.

report/commit.pyc

-995 Bytes
Binary file not shown.

report/language.pyc

-872 Bytes
Binary file not shown.

report/run.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Run:
22

3-
def __init__(self, commit=None, timestamp=None, language=None, job=None, spec=None, generate_outcome=None, build_outcome=None, generate_error=None, build_error=None, is_regression=None, codegen_version=None, v2_version=None, v3_version=None, spec_url=None, generated_folder_link=None):
3+
def __init__(self, commit=None, timestamp=None, language=None, job=None, spec=None, generate_outcome=None, build_outcome=None, generate_error=None, build_error=None, is_regression=None, codegen_version=None, v2_version=None, v3_version=None, spec_url=None, generated_folder_link=None, isV2=False):
44
self.commit = commit
55
self.timestamp = timestamp
66
self.language = language
@@ -17,6 +17,7 @@ def __init__(self, commit=None, timestamp=None, language=None, job=None, spec=No
1717
self.v3_version = v3_version
1818
self.spec_url = spec_url
1919
self.generated_folder_link = generated_folder_link
20+
self.isV2 = isV2
2021

2122
def find_match(self, runs):
2223
for run in runs:

report/run.pyc

-1.39 KB
Binary file not shown.

0 commit comments

Comments
 (0)