3
3
import re
4
4
import sys
5
5
import time
6
- from typing import IO , AnyStr , Final
6
+ from pathlib import Path
7
+ from typing import IO , AnyStr , Final , Literal
7
8
8
9
from .ci import CIProvider , detect_ci_provider
9
10
@@ -70,13 +71,15 @@ def __init__(self, *, unicode: bool) -> None:
70
71
71
72
72
73
class Logger :
73
- fold_mode : str
74
+ fold_mode : Literal [ "azure" , "github" , "travis" , "disabled" ]
74
75
colors_enabled : bool
75
76
unicode_enabled : bool
76
77
active_build_identifier : str | None = None
77
78
build_start_time : float | None = None
78
79
step_start_time : float | None = None
79
80
active_fold_group_name : str | None = None
81
+ summary : list [tuple [str , Path | None , float ]]
82
+ summary_mode : Literal ["github" , "generic" ]
80
83
81
84
def __init__ (self ) -> None :
82
85
if sys .platform == "win32" and hasattr (sys .stdout , "reconfigure" ):
@@ -88,25 +91,33 @@ def __init__(self) -> None:
88
91
89
92
ci_provider = detect_ci_provider ()
90
93
91
- if ci_provider == CIProvider .azure_pipelines :
92
- self .fold_mode = "azure"
93
- self .colors_enabled = True
94
+ match ci_provider :
95
+ case CIProvider .azure_pipelines :
96
+ self .fold_mode = "azure"
97
+ self .colors_enabled = True
98
+ self .summary_mode = "generic"
94
99
95
- elif ci_provider == CIProvider .github_actions :
96
- self .fold_mode = "github"
97
- self .colors_enabled = True
100
+ case CIProvider .github_actions :
101
+ self .fold_mode = "github"
102
+ self .colors_enabled = True
103
+ self .summary_mode = "github"
98
104
99
- elif ci_provider == CIProvider .travis_ci :
100
- self .fold_mode = "travis"
101
- self .colors_enabled = True
105
+ case CIProvider .travis_ci :
106
+ self .fold_mode = "travis"
107
+ self .colors_enabled = True
108
+ self .summary_mode = "generic"
102
109
103
- elif ci_provider == CIProvider .appveyor :
104
- self .fold_mode = "disabled"
105
- self .colors_enabled = True
110
+ case CIProvider .appveyor :
111
+ self .fold_mode = "disabled"
112
+ self .colors_enabled = True
113
+ self .summary_mode = "generic"
106
114
107
- else :
108
- self .fold_mode = "disabled"
109
- self .colors_enabled = file_supports_color (sys .stdout )
115
+ case _:
116
+ self .fold_mode = "disabled"
117
+ self .colors_enabled = file_supports_color (sys .stdout )
118
+ self .summary_mode = "generic"
119
+
120
+ self .summary = []
110
121
111
122
def build_start (self , identifier : str ) -> None :
112
123
self .step_end ()
@@ -120,7 +131,7 @@ def build_start(self, identifier: str) -> None:
120
131
self .build_start_time = time .time ()
121
132
self .active_build_identifier = identifier
122
133
123
- def build_end (self ) -> None :
134
+ def build_end (self , filename : Path | None ) -> None :
124
135
assert self .build_start_time is not None
125
136
assert self .active_build_identifier is not None
126
137
self .step_end ()
@@ -133,6 +144,8 @@ def build_end(self) -> None:
133
144
print (
134
145
f"{ c .green } { s .done } { c .end } { self .active_build_identifier } finished in { duration :.2f} s"
135
146
)
147
+ self .summary .append ((self .active_build_identifier , filename , duration ))
148
+
136
149
self .build_start_time = None
137
150
self .active_build_identifier = None
138
151
@@ -183,6 +196,24 @@ def error(self, error: BaseException | str) -> None:
183
196
c = self .colors
184
197
print (f"cibuildwheel: { c .bright_red } error{ c .end } : { error } \n " , file = sys .stderr )
185
198
199
+ def print_summary (self ) -> None :
200
+ summary = "## 🎡: Wheels\n \n | Identifier | Wheel | Size | Time |\n |===|===|===|===|\n "
201
+ for ident , filename , duration in self .summary :
202
+ if filename :
203
+ size_mb = filename .stat ().st_size / 1024 ** 2
204
+ summary += f"| { ident } | { filename .name } | { size_mb :.2f} MB | { duration } |"
205
+ else :
206
+ summary += f"| { ident } | test only | --- | { duration } |"
207
+
208
+ match self .summary_mode :
209
+ case "github" :
210
+ Path (os .environ ["GITHUB_STEP_SUMMARY" ]).write_text (summary , encoding = "utf-8" )
211
+ print (summary )
212
+ case _:
213
+ print (summary )
214
+
215
+ self .summary = []
216
+
186
217
@property
187
218
def step_active (self ) -> bool :
188
219
return self .step_start_time is not None
0 commit comments