@@ -2027,6 +2027,11 @@ def __init__(self, forwarding_rule="always"):
2027
2027
self ._forwarding_rule = forwarding_rule
2028
2028
2029
2029
def _clear_registries (self ):
2030
+ if hasattr (warnings , "_filters_mutated" ):
2031
+ # clearing the registry should not be necessary on new pythons,
2032
+ # instead the filters should be mutated.
2033
+ warnings ._filters_mutated ()
2034
+ return
2030
2035
# Simply clear the registry, this should normally be harmless,
2031
2036
# note that on new pythons it would be invalidated anyway.
2032
2037
for module in self ._tmp_modules :
@@ -2116,6 +2121,8 @@ def __enter__(self):
2116
2121
raise RuntimeError ("cannot enter suppress_warnings twice." )
2117
2122
2118
2123
self ._orig_show = warnings .showwarning
2124
+ if hasattr (warnings , "_showwarnmsg" ):
2125
+ self ._orig_showmsg = warnings ._showwarnmsg
2119
2126
self ._filters = warnings .filters
2120
2127
warnings .filters = self ._filters [:]
2121
2128
@@ -2139,20 +2146,29 @@ def __enter__(self):
2139
2146
module = module_regex )
2140
2147
self ._tmp_modules .add (mod )
2141
2148
warnings .showwarning = self ._showwarning
2149
+ if hasattr (warnings , "_showwarnmsg" ):
2150
+ warnings ._showwarnmsg = self ._showwarnmsg
2142
2151
self ._clear_registries ()
2143
2152
2144
2153
return self
2145
2154
2146
2155
def __exit__ (self , * exc_info ):
2147
2156
warnings .showwarning = self ._orig_show
2157
+ if hasattr (warnings , "_showwarnmsg" ):
2158
+ warnings ._showwarnmsg = self ._orig_showmsg
2148
2159
warnings .filters = self ._filters
2149
2160
self ._clear_registries ()
2150
2161
self ._entered = False
2151
2162
del self ._orig_show
2152
2163
del self ._filters
2153
2164
2165
+ def _showwarnmsg (self , msg ):
2166
+ self ._showwarning (msg .message , msg .category , msg .filename , msg .lineno ,
2167
+ msg .file , msg .line , use_warnmsg = msg )
2168
+
2154
2169
def _showwarning (self , message , category , filename , lineno ,
2155
2170
* args , ** kwargs ):
2171
+ use_warnmsg = kwargs .pop ("use_warnmsg" , None )
2156
2172
for cat , _ , pattern , mod , rec in (
2157
2173
self ._suppressions + self ._tmp_suppressions )[::- 1 ]:
2158
2174
if (issubclass (category , cat ) and
@@ -2179,8 +2195,11 @@ def _showwarning(self, message, category, filename, lineno,
2179
2195
# There is no filter in place, so pass to the outside handler
2180
2196
# unless we should only pass it once
2181
2197
if self ._forwarding_rule == "always" :
2182
- self ._orig_show (message , category , filename , lineno ,
2183
- * args , ** kwargs )
2198
+ if use_warnmsg is None :
2199
+ self ._orig_show (message , category , filename , lineno ,
2200
+ * args , ** kwargs )
2201
+ else :
2202
+ self ._orig_showmsg (use_warnmsg )
2184
2203
return
2185
2204
2186
2205
if self ._forwarding_rule == "once" :
@@ -2193,7 +2212,11 @@ def _showwarning(self, message, category, filename, lineno,
2193
2212
if signature in self ._forwarded :
2194
2213
return
2195
2214
self ._forwarded .add (signature )
2196
- self ._orig_show (message , category , filename , lineno , * args , ** kwargs )
2215
+ if use_warnmsg is None :
2216
+ self ._orig_show (message , category , filename , lineno , * args ,
2217
+ ** kwargs )
2218
+ else :
2219
+ self ._orig_showmsg (use_warnmsg )
2197
2220
2198
2221
def __call__ (self , func ):
2199
2222
"""
0 commit comments