@@ -96,13 +96,11 @@ def correct_roundoff(x, dpi, n):
9696class MovieWriterRegistry :
9797 '''Registry of available writer classes by human readable name.'''
9898 def __init__ (self ):
99- self .avail = dict ()
10099 self ._registered = dict ()
101- self ._dirty = False
102100
101+ @cbook .deprecated ("3.2" )
103102 def set_dirty (self ):
104103 """Sets a flag to re-setup the writers."""
105- self ._dirty = True
106104
107105 def register (self , name ):
108106 """Decorator for registering a class under a name.
@@ -113,32 +111,27 @@ def register(self, name):
113111 class Foo:
114112 pass
115113 """
116- def wrapper (writerClass ):
117- self ._registered [name ] = writerClass
118- if writerClass .isAvailable ():
119- self .avail [name ] = writerClass
120- return writerClass
114+ def wrapper (writer_cls ):
115+ self ._registered [name ] = writer_cls
116+ return writer_cls
121117 return wrapper
122118
119+ @cbook .deprecated ("3.2" )
123120 def ensure_not_dirty (self ):
124121 """If dirty, reasks the writers if they are available"""
125- if self ._dirty :
126- self .reset_available_writers ()
127122
123+ @cbook .deprecated ("3.2" )
128124 def reset_available_writers (self ):
129125 """Reset the available state of all registered writers"""
130- self .avail = {name : writerClass
131- for name , writerClass in self ._registered .items ()
132- if writerClass .isAvailable ()}
133- self ._dirty = False
134126
135- def list ( self ):
136- '''Get a list of available MovieWriters.'''
137- self . ensure_not_dirty ()
138- return list ( self .avail )
127+ @ cbook . deprecated ( "3.2" )
128+ @ property
129+ def avail ( self ):
130+ return { name : self ._registered [ name ] for name in self . list ()}
139131
140132 def is_available (self , name ):
141- '''Check if given writer is available by name.
133+ """
134+ Check if given writer is available by name.
142135
143136 Parameters
144137 ----------
@@ -147,19 +140,28 @@ def is_available(self, name):
147140 Returns
148141 -------
149142 available : bool
150- '''
151- self .ensure_not_dirty ()
152- return name in self .avail
153-
154- def __getitem__ (self , name ):
155- self .ensure_not_dirty ()
156- if not self .avail :
157- raise RuntimeError ("No MovieWriters available!" )
143+ """
158144 try :
159- return self .avail [name ]
145+ cls = self ._registered [name ]
160146 except KeyError :
161- raise RuntimeError (
162- 'Requested MovieWriter ({}) not available' .format (name ))
147+ return False
148+ return cls .isAvailable ()
149+
150+ def __iter__ (self ):
151+ """Iterate over names of available writer class."""
152+ for name in self ._registered :
153+ if self .is_available (name ):
154+ yield name
155+
156+ def list (self ):
157+ """Get a list of available MovieWriters."""
158+ return [* self ]
159+
160+ def __getitem__ (self , name ):
161+ """Get an available writer class from its name."""
162+ if self .is_available (name ):
163+ return self ._registered [name ]
164+ raise RuntimeError (f"Requested MovieWriter ({ name } ) not available" )
163165
164166
165167writers = MovieWriterRegistry ()
@@ -1091,22 +1093,21 @@ def func(current_frame: int, total_frames: int) -> Any
10911093 # If we have the name of a writer, instantiate an instance of the
10921094 # registered class.
10931095 if isinstance (writer , str ):
1094- if writer in writers .avail :
1096+ if writers .is_available ( writer ) :
10951097 writer = writers [writer ](fps , codec , bitrate ,
10961098 extra_args = extra_args ,
10971099 metadata = metadata )
10981100 else :
1099- if writers .list ():
1100- alt_writer = writers [writers .list ()[0 ]]
1101- _log .warning ("MovieWriter %s unavailable; trying to use "
1102- "%s instead." , writer , alt_writer )
1103- writer = alt_writer (
1104- fps , codec , bitrate ,
1105- extra_args = extra_args , metadata = metadata )
1106- else :
1101+ alt_writer = next (writers , None )
1102+ if alt_writer is None :
11071103 raise ValueError ("Cannot save animation: no writers are "
11081104 "available. Please install ffmpeg to "
11091105 "save animations." )
1106+ _log .warning ("MovieWriter %s unavailable; trying to use %s "
1107+ "instead." , writer , alt_writer )
1108+ writer = alt_writer (
1109+ fps , codec , bitrate ,
1110+ extra_args = extra_args , metadata = metadata )
11101111 _log .info ('Animation.save using %s' , type (writer ))
11111112
11121113 if 'bbox_inches' in savefig_kwargs :
0 commit comments