@@ -21,13 +21,17 @@ def main() -> None:
21
21
set_verbosity (enable_verbosity = False )
22
22
23
23
if "INPUT_SIZE-DELTAS-REPORTS-ARTIFACT-NAME" in os .environ :
24
- print ("::warning::The size-deltas-report-artifact-name input is deprecated. Use the equivalent input: "
25
- "sketches-reports-source instead." )
24
+ print (
25
+ "::warning::The size-deltas-report-artifact-name input is deprecated. Use the equivalent input: "
26
+ "sketches-reports-source instead."
27
+ )
26
28
os .environ ["INPUT_SKETCHES-REPORTS-SOURCE" ] = os .environ ["INPUT_SIZE-DELTAS-REPORTS-ARTIFACT-NAME" ]
27
29
28
- report_size_deltas = ReportSizeDeltas (repository_name = os .environ ["GITHUB_REPOSITORY" ],
29
- sketches_reports_source = os .environ ["INPUT_SKETCHES-REPORTS-SOURCE" ],
30
- token = os .environ ["INPUT_GITHUB-TOKEN" ])
30
+ report_size_deltas = ReportSizeDeltas (
31
+ repository_name = os .environ ["GITHUB_REPOSITORY" ],
32
+ sketches_reports_source = os .environ ["INPUT_SKETCHES-REPORTS-SOURCE" ],
33
+ token = os .environ ["INPUT_GITHUB-TOKEN" ],
34
+ )
31
35
32
36
report_size_deltas .report_size_deltas ()
33
37
@@ -59,11 +63,13 @@ class ReportSizeDeltas:
59
63
artifact_name -- name of the workflow artifact that contains the memory usage data
60
64
token -- GitHub access token
61
65
"""
66
+
62
67
report_key_beginning = "**Memory usage change @ "
63
68
not_applicable_indicator = "N/A"
64
69
65
70
class ReportKeys :
66
71
"""Key names used in the sketches report dictionary."""
72
+
67
73
boards = "boards"
68
74
board = "board"
69
75
commit_hash = "commit_hash"
@@ -115,8 +121,7 @@ def report_size_deltas_from_workflow_artifacts(self) -> None:
115
121
page_number = 1
116
122
page_count = 1
117
123
while page_number <= page_count :
118
- api_data = self .api_request (request = "repos/" + self .repository_name + "/pulls" ,
119
- page_number = page_number )
124
+ api_data = self .api_request (request = "repos/" + self .repository_name + "/pulls" , page_number = page_number )
120
125
prs_data = api_data ["json_data" ]
121
126
for pr_data in prs_data :
122
127
# Note: closed PRs are not listed in the API response
@@ -130,16 +135,14 @@ def report_size_deltas_from_workflow_artifacts(self) -> None:
130
135
print ("::debug::PR locked, skipping" )
131
136
continue
132
137
133
- if self .report_exists (pr_number = pr_number ,
134
- pr_head_sha = pr_head_sha ):
138
+ if self .report_exists (pr_number = pr_number , pr_head_sha = pr_head_sha ):
135
139
# Go on to the next PR
136
140
print ("::debug::Report already exists" )
137
141
continue
138
142
139
143
artifact_download_url = self .get_artifact_download_url_for_sha (
140
- pr_user_login = pr_data ["user" ]["login" ],
141
- pr_head_ref = pr_data ["head" ]["ref" ],
142
- pr_head_sha = pr_head_sha )
144
+ pr_user_login = pr_data ["user" ]["login" ], pr_head_ref = pr_data ["head" ]["ref" ], pr_head_sha = pr_head_sha
145
+ )
143
146
if artifact_download_url is None :
144
147
# Go on to the next PR
145
148
print ("::debug::No sketches report artifact found" )
@@ -175,9 +178,10 @@ def report_exists(self, pr_number: int, pr_head_sha: str) -> bool:
175
178
page_number = 1
176
179
page_count = 1
177
180
while page_number <= page_count :
178
- api_data = self .api_request (request = "repos/" + self .repository_name + "/issues/" + str (pr_number )
179
- + "/comments" ,
180
- page_number = page_number )
181
+ api_data = self .api_request (
182
+ request = "repos/" + self .repository_name + "/issues/" + str (pr_number ) + "/comments" ,
183
+ page_number = page_number ,
184
+ )
181
185
182
186
comments_data = api_data ["json_data" ]
183
187
for comment_data in comments_data :
@@ -203,10 +207,15 @@ def get_artifact_download_url_for_sha(self, pr_user_login: str, pr_head_ref: str
203
207
page_number = 1
204
208
page_count = 1
205
209
while page_number <= page_count :
206
- api_data = self .api_request (request = "repos/" + self .repository_name + "/actions/runs" ,
207
- request_parameters = "actor=" + pr_user_login + "&branch=" + pr_head_ref
208
- + "&event=pull_request&status=completed" ,
209
- page_number = page_number )
210
+ api_data = self .api_request (
211
+ request = "repos/" + self .repository_name + "/actions/runs" ,
212
+ request_parameters = "actor="
213
+ + pr_user_login
214
+ + "&branch="
215
+ + pr_head_ref
216
+ + "&event=pull_request&status=completed" ,
217
+ page_number = page_number ,
218
+ )
210
219
runs_data = api_data ["json_data" ]
211
220
212
221
# Find the runs with the head SHA of the PR (there may be multiple runs)
@@ -233,9 +242,10 @@ def get_artifact_download_url_for_run(self, run_id: str) -> str | None:
233
242
page_number = 1
234
243
page_count = 1
235
244
while page_number <= page_count :
236
- api_data = self .api_request (request = "repos/" + self .repository_name + "/actions/runs/"
237
- + str (run_id ) + "/artifacts" ,
238
- page_number = page_number )
245
+ api_data = self .api_request (
246
+ request = "repos/" + self .repository_name + "/actions/runs/" + str (run_id ) + "/artifacts" ,
247
+ page_number = page_number ,
248
+ )
239
249
artifacts_data = api_data ["json_data" ]
240
250
241
251
for artifact_data in artifacts_data ["artifacts" ]:
@@ -259,8 +269,9 @@ def get_artifact(self, artifact_download_url: str):
259
269
artifact_folder_object = tempfile .TemporaryDirectory (prefix = "reportsizedeltas-" )
260
270
try :
261
271
# Download artifact
262
- with open (file = artifact_folder_object .name + "/" + self .sketches_reports_source + ".zip" ,
263
- mode = "wb" ) as out_file :
272
+ with open (
273
+ file = artifact_folder_object .name + "/" + self .sketches_reports_source + ".zip" , mode = "wb"
274
+ ) as out_file :
264
275
with self .raw_http_request (url = artifact_download_url ) as fp :
265
276
out_file .write (fp .read ())
266
277
@@ -292,10 +303,11 @@ def get_sketches_reports(self, artifact_folder_object):
292
303
report_data = json .load (report_file )
293
304
if (
294
305
(self .ReportKeys .boards not in report_data )
295
- or (self .ReportKeys .sizes
296
- not in report_data [self .ReportKeys .boards ][0 ])
297
- or (self .ReportKeys .maximum
298
- not in report_data [self .ReportKeys .boards ][0 ][self .ReportKeys .sizes ][0 ])
306
+ or (self .ReportKeys .sizes not in report_data [self .ReportKeys .boards ][0 ])
307
+ or (
308
+ self .ReportKeys .maximum
309
+ not in report_data [self .ReportKeys .boards ][0 ][self .ReportKeys .sizes ][0 ]
310
+ )
299
311
):
300
312
# Sketches reports use an old format, skip
301
313
print ("Old format sketches report found, skipping" )
@@ -308,8 +320,10 @@ def get_sketches_reports(self, artifact_folder_object):
308
320
break
309
321
310
322
if not sketches_reports :
311
- print ("No size deltas data found in workflow artifact for this PR. The compile-examples action's "
312
- "enable-size-deltas-report input must be set to true to produce size deltas data." )
323
+ print (
324
+ "No size deltas data found in workflow artifact for this PR. The compile-examples action's "
325
+ "enable-size-deltas-report input must be set to true to produce size deltas data."
326
+ )
313
327
314
328
return sketches_reports
315
329
@@ -345,24 +359,23 @@ def generate_report(self, sketches_reports) -> str:
345
359
report_markdown = report_markdown + generate_markdown_table (row_list = summary_report_data ) + "\n "
346
360
347
361
# Add full table
348
- report_markdown_with_table = (report_markdown
349
- + "<details> \n "
350
- "<summary>Click for full report table</summary> \n \n " )
351
- report_markdown_with_table = (report_markdown_with_table
352
- + generate_markdown_table (row_list = full_report_data )
353
- + " \n </details> \n \n " )
362
+ report_markdown_with_table = (
363
+ report_markdown + "<details> \n " "<summary>Click for full report table</summary> \n \n "
364
+ )
365
+ report_markdown_with_table = (
366
+ report_markdown_with_table + generate_markdown_table (row_list = full_report_data ) + " \n </details> \n \n "
367
+ )
354
368
355
369
if len (report_markdown_with_table ) < maximum_report_length :
356
370
report_markdown = report_markdown_with_table
357
371
358
372
# Add full CSV
359
- report_markdown_with_csv = (report_markdown
360
- + "<details>\n "
361
- "<summary>Click for full report CSV</summary>\n \n "
362
- "```\n " )
363
- report_markdown_with_csv = (report_markdown_with_csv
364
- + generate_csv_table (row_list = full_report_data )
365
- + "```\n </details>" )
373
+ report_markdown_with_csv = (
374
+ report_markdown + "<details>\n " "<summary>Click for full report CSV</summary>\n \n " "```\n "
375
+ )
376
+ report_markdown_with_csv = (
377
+ report_markdown_with_csv + generate_csv_table (row_list = full_report_data ) + "```\n </details>"
378
+ )
366
379
367
380
if len (report_markdown_with_csv ) < maximum_report_length :
368
381
report_markdown = report_markdown_with_csv
@@ -386,51 +399,32 @@ def add_summary_report_row(self, report_data, fqbn_data) -> None:
386
399
# Populate the row with data
387
400
for size_data in fqbn_data [self .ReportKeys .sizes ]:
388
401
# Determine column number for this memory type
389
- column_number = get_report_column_number (
390
- report = report_data ,
391
- column_heading = size_data [self .ReportKeys .name ]
392
- )
402
+ column_number = get_report_column_number (report = report_data , column_heading = size_data [self .ReportKeys .name ])
393
403
394
404
# Add the memory data to the cell
395
405
if self .ReportKeys .delta in size_data :
396
406
# Absolute data
397
- report_data [row_number ][column_number ] = (
398
- self .get_summary_value (
399
- show_emoji = True ,
400
- minimum = size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ][
401
- self .ReportKeys .minimum ],
402
- maximum = size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ][
403
- self .ReportKeys .maximum ]
404
- )
407
+ report_data [row_number ][column_number ] = self .get_summary_value (
408
+ show_emoji = True ,
409
+ minimum = size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ][self .ReportKeys .minimum ],
410
+ maximum = size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ][self .ReportKeys .maximum ],
405
411
)
406
412
407
413
# Relative data
408
- report_data [row_number ][column_number + 1 ] = (
409
- self .get_summary_value (
410
- show_emoji = False ,
411
- minimum = size_data [self .ReportKeys .delta ][self .ReportKeys .relative ][
412
- self .ReportKeys .minimum ],
413
- maximum = size_data [self .ReportKeys .delta ][self .ReportKeys .relative ][
414
- self .ReportKeys .maximum ]
415
- )
414
+ report_data [row_number ][column_number + 1 ] = self .get_summary_value (
415
+ show_emoji = False ,
416
+ minimum = size_data [self .ReportKeys .delta ][self .ReportKeys .relative ][self .ReportKeys .minimum ],
417
+ maximum = size_data [self .ReportKeys .delta ][self .ReportKeys .relative ][self .ReportKeys .maximum ],
416
418
)
417
419
else :
418
420
# Absolute data
419
- report_data [row_number ][column_number ] = (
420
- self .get_summary_value (
421
- show_emoji = True ,
422
- minimum = self .not_applicable_indicator ,
423
- maximum = self .not_applicable_indicator
424
- )
421
+ report_data [row_number ][column_number ] = self .get_summary_value (
422
+ show_emoji = True , minimum = self .not_applicable_indicator , maximum = self .not_applicable_indicator
425
423
)
426
424
427
425
# Relative data
428
- report_data [row_number ][column_number + 1 ] = (
429
- self .get_summary_value (
430
- show_emoji = False ,
431
- minimum = self .not_applicable_indicator ,
432
- maximum = self .not_applicable_indicator
433
- )
426
+ report_data [row_number ][column_number + 1 ] = self .get_summary_value (
427
+ show_emoji = False , minimum = self .not_applicable_indicator , maximum = self .not_applicable_indicator
434
428
)
435
429
436
430
def add_detailed_report_row (self , report_data , fqbn_data ) -> None :
@@ -454,23 +448,20 @@ def add_detailed_report_row(self, report_data, fqbn_data) -> None:
454
448
report = report_data ,
455
449
column_heading = (
456
450
"`{sketch_name}`<br>{size_name}" .format (
457
- sketch_name = sketch [self .ReportKeys .name ],
458
- size_name = size_data [self .ReportKeys .name ]
451
+ sketch_name = sketch [self .ReportKeys .name ], size_name = size_data [self .ReportKeys .name ]
459
452
)
460
- )
453
+ ),
461
454
)
462
455
463
456
# Add the memory data to the cell
464
457
if self .ReportKeys .delta in size_data :
465
458
# Absolute
466
- report_data [row_number ][column_number ] = (
467
- size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ]
468
- )
459
+ report_data [row_number ][column_number ] = size_data [self .ReportKeys .delta ][self .ReportKeys .absolute ]
469
460
470
461
# Relative
471
- report_data [row_number ][column_number + 1 ] = (
472
- size_data [ self .ReportKeys .delta ][ self . ReportKeys . relative ]
473
- )
462
+ report_data [row_number ][column_number + 1 ] = size_data [ self . ReportKeys . delta ][
463
+ self .ReportKeys .relative
464
+ ]
474
465
else :
475
466
# Absolute
476
467
report_data [row_number ][column_number ] = self .not_applicable_indicator
@@ -528,11 +519,7 @@ def comment_report(self, pr_number: int, report_markdown: str) -> None:
528
519
report_data = {"body" : report_markdown }
529
520
report_data = json .dumps (obj = report_data )
530
521
report_data = report_data .encode (encoding = "utf-8" )
531
- url = ("https://api.github.com/repos/"
532
- + self .repository_name
533
- + "/issues/"
534
- + str (pr_number )
535
- + "/comments" )
522
+ url = "https://api.github.com/repos/" + self .repository_name + "/issues/" + str (pr_number ) + "/comments"
536
523
537
524
self .http_request (url = url , data = report_data )
538
525
@@ -549,8 +536,15 @@ def api_request(self, request: str, request_parameters: str = "", page_number: i
549
536
page_number -- Some responses will be paginated. This argument specifies which page should be returned.
550
537
(default value: 1)
551
538
"""
552
- return self .get_json_response (url = "https://api.github.com/" + request + "?" + request_parameters + "&page="
553
- + str (page_number ) + "&per_page=100" )
539
+ return self .get_json_response (
540
+ url = "https://api.github.com/"
541
+ + request
542
+ + "?"
543
+ + request_parameters
544
+ + "&page="
545
+ + str (page_number )
546
+ + "&per_page=100"
547
+ )
554
548
555
549
def get_json_response (self , url : str ):
556
550
"""Load the specified URL and return a dictionary:
@@ -599,9 +593,11 @@ def http_request(self, url: str, data: str | None = None) -> dict[str]:
599
593
(default value: None)
600
594
"""
601
595
with self .raw_http_request (url = url , data = data ) as response_object :
602
- return {"body" : response_object .read ().decode (encoding = "utf-8" , errors = "ignore" ),
603
- "headers" : response_object .info (),
604
- "url" : response_object .geturl ()}
596
+ return {
597
+ "body" : response_object .read ().decode (encoding = "utf-8" , errors = "ignore" ),
598
+ "headers" : response_object .info (),
599
+ "url" : response_object .geturl (),
600
+ }
605
601
606
602
def raw_http_request (self , url : str , data : str | None = None ):
607
603
"""Make a request and return an object containing the response.
@@ -681,7 +677,7 @@ def determine_urlopen_retry(exception) -> bool:
681
677
# urllib.error.URLError: <urlopen error [WinError 10061] No connection could be made because the target
682
678
# machine actively refused it>
683
679
"<urlopen error [WinError 10061] No connection could be made because the target machine actively refused "
684
- "it>"
680
+ "it>" ,
685
681
]
686
682
687
683
# Delay before retry (seconds)
@@ -713,7 +709,7 @@ def get_page_count(link_header: str | None) -> int:
713
709
if link_header is not None :
714
710
# Get the pagination data
715
711
for link in link_header .split ("," ):
716
- if link [- 13 :] == " >; rel=\ " last\" " :
712
+ if link [- 13 :] == ' >; rel="last"' :
717
713
link = re .split ("[?&>]" , link )
718
714
for parameter in link :
719
715
if parameter [:5 ] == "page=" :
0 commit comments