@@ -21,13 +21,17 @@ def main() -> None:
2121 set_verbosity (enable_verbosity = False )
2222
2323 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+ )
2628 os .environ ["INPUT_SKETCHES-REPORTS-SOURCE" ] = os .environ ["INPUT_SIZE-DELTAS-REPORTS-ARTIFACT-NAME" ]
2729
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+ )
3135
3236 report_size_deltas .report_size_deltas ()
3337
@@ -59,11 +63,13 @@ class ReportSizeDeltas:
5963 artifact_name -- name of the workflow artifact that contains the memory usage data
6064 token -- GitHub access token
6165 """
66+
6267 report_key_beginning = "**Memory usage change @ "
6368 not_applicable_indicator = "N/A"
6469
6570 class ReportKeys :
6671 """Key names used in the sketches report dictionary."""
72+
6773 boards = "boards"
6874 board = "board"
6975 commit_hash = "commit_hash"
@@ -115,8 +121,7 @@ def report_size_deltas_from_workflow_artifacts(self) -> None:
115121 page_number = 1
116122 page_count = 1
117123 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 )
120125 prs_data = api_data ["json_data" ]
121126 for pr_data in prs_data :
122127 # Note: closed PRs are not listed in the API response
@@ -130,16 +135,14 @@ def report_size_deltas_from_workflow_artifacts(self) -> None:
130135 print ("::debug::PR locked, skipping" )
131136 continue
132137
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 ):
135139 # Go on to the next PR
136140 print ("::debug::Report already exists" )
137141 continue
138142
139143 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+ )
143146 if artifact_download_url is None :
144147 # Go on to the next PR
145148 print ("::debug::No sketches report artifact found" )
@@ -175,9 +178,10 @@ def report_exists(self, pr_number: int, pr_head_sha: str) -> bool:
175178 page_number = 1
176179 page_count = 1
177180 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+ )
181185
182186 comments_data = api_data ["json_data" ]
183187 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
203207 page_number = 1
204208 page_count = 1
205209 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+ )
210219 runs_data = api_data ["json_data" ]
211220
212221 # 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:
233242 page_number = 1
234243 page_count = 1
235244 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+ )
239249 artifacts_data = api_data ["json_data" ]
240250
241251 for artifact_data in artifacts_data ["artifacts" ]:
@@ -259,8 +269,9 @@ def get_artifact(self, artifact_download_url: str):
259269 artifact_folder_object = tempfile .TemporaryDirectory (prefix = "reportsizedeltas-" )
260270 try :
261271 # 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 :
264275 with self .raw_http_request (url = artifact_download_url ) as fp :
265276 out_file .write (fp .read ())
266277
@@ -292,10 +303,11 @@ def get_sketches_reports(self, artifact_folder_object):
292303 report_data = json .load (report_file )
293304 if (
294305 (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+ )
299311 ):
300312 # Sketches reports use an old format, skip
301313 print ("Old format sketches report found, skipping" )
@@ -308,8 +320,10 @@ def get_sketches_reports(self, artifact_folder_object):
308320 break
309321
310322 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+ )
313327
314328 return sketches_reports
315329
@@ -345,24 +359,23 @@ def generate_report(self, sketches_reports) -> str:
345359 report_markdown = report_markdown + generate_markdown_table (row_list = summary_report_data ) + "\n "
346360
347361 # 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+ )
354368
355369 if len (report_markdown_with_table ) < maximum_report_length :
356370 report_markdown = report_markdown_with_table
357371
358372 # 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+ )
366379
367380 if len (report_markdown_with_csv ) < maximum_report_length :
368381 report_markdown = report_markdown_with_csv
@@ -386,51 +399,32 @@ def add_summary_report_row(self, report_data, fqbn_data) -> None:
386399 # Populate the row with data
387400 for size_data in fqbn_data [self .ReportKeys .sizes ]:
388401 # 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 ])
393403
394404 # Add the memory data to the cell
395405 if self .ReportKeys .delta in size_data :
396406 # 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 ],
405411 )
406412
407413 # 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 ],
416418 )
417419 else :
418420 # 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
425423 )
426424
427425 # 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
434428 )
435429
436430 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:
454448 report = report_data ,
455449 column_heading = (
456450 "`{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 ]
459452 )
460- )
453+ ),
461454 )
462455
463456 # Add the memory data to the cell
464457 if self .ReportKeys .delta in size_data :
465458 # 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 ]
469460
470461 # 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+ ]
474465 else :
475466 # Absolute
476467 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:
528519 report_data = {"body" : report_markdown }
529520 report_data = json .dumps (obj = report_data )
530521 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"
536523
537524 self .http_request (url = url , data = report_data )
538525
@@ -549,8 +536,15 @@ def api_request(self, request: str, request_parameters: str = "", page_number: i
549536 page_number -- Some responses will be paginated. This argument specifies which page should be returned.
550537 (default value: 1)
551538 """
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+ )
554548
555549 def get_json_response (self , url : str ):
556550 """Load the specified URL and return a dictionary:
@@ -599,9 +593,11 @@ def http_request(self, url: str, data: str | None = None) -> dict[str]:
599593 (default value: None)
600594 """
601595 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+ }
605601
606602 def raw_http_request (self , url : str , data : str | None = None ):
607603 """Make a request and return an object containing the response.
@@ -681,7 +677,7 @@ def determine_urlopen_retry(exception) -> bool:
681677 # urllib.error.URLError: <urlopen error [WinError 10061] No connection could be made because the target
682678 # machine actively refused it>
683679 "<urlopen error [WinError 10061] No connection could be made because the target machine actively refused "
684- "it>"
680+ "it>" ,
685681 ]
686682
687683 # Delay before retry (seconds)
@@ -713,7 +709,7 @@ def get_page_count(link_header: str | None) -> int:
713709 if link_header is not None :
714710 # Get the pagination data
715711 for link in link_header .split ("," ):
716- if link [- 13 :] == " >; rel=\ " last\" " :
712+ if link [- 13 :] == ' >; rel="last"' :
717713 link = re .split ("[?&>]" , link )
718714 for parameter in link :
719715 if parameter [:5 ] == "page=" :
0 commit comments