2626 logger ,
2727 tempconfig ,
2828)
29- from manim .cli .cli_utils import code_input_prompt , prompt_user_with_choice
29+ from manim .cli .cli_utils import code_input_prompt , prompt_user_with_list
3030from manim .cli .render .ease_of_access_options import ease_of_access_options
3131from manim .cli .render .global_options import global_options
3232from manim .cli .render .output_options import output_options
@@ -92,15 +92,15 @@ def render(**kwargs: Any) -> ClickArgs | dict[str, Any]:
9292
9393 SCENES is an optional list of scenes in the file.
9494 """
95- warn_and_change_deprecated_args (kwargs )
95+ warn_and_change_deprecated_arguments (kwargs )
9696
9797 click_args = ClickArgs (kwargs )
9898 if kwargs ["jupyter" ]:
9999 return click_args
100100
101101 config .digest_args (click_args )
102102
103- scenes = solve_rendrered_scenes (config .input_file )
103+ scenes = scenes_from_input (config .input_file )
104104
105105 if config .renderer == RendererType .OPENGL :
106106 from manim .renderer .opengl_renderer import OpenGLRenderer
@@ -142,33 +142,40 @@ def render(**kwargs: Any) -> ClickArgs | dict[str, Any]:
142142
143143
144144def version_notification () -> None :
145- """Fetch version from Internet or use cache"""
146- file = Path (os .path .dirname (__file__ )) / ".version_cache.log"
147- stable = None
148-
149- if file .exists ():
150- with file .open () as f :
151- last_time = f .readline ()
152- if not time .time () - int (last_time ) > 86_400 :
153- stable = f .readline ()
154-
155- if stable is None :
156- new_stable = fetch_version ()
157- if new_stable :
158- with file .open (mode = "w" ) as f :
159- f .write (str (int (time .time ())) + "\n " + str (new_stable ))
160- stable = new_stable
161-
162- if stable != __version__ :
145+ """Compare used version to latest version of manim.
146+ Version info is fetched from internet once a day and cached into a file.
147+ """
148+ stable_version = None
149+
150+ cache_file = Path (os .path .dirname (__file__ )) / ".version_cache.log"
151+
152+ if cache_file .exists ():
153+ with cache_file .open () as f :
154+ cache_lifetime = int (f .readline ())
155+ if time .time () < cache_lifetime :
156+ stable_version = f .readline ()
157+
158+ if stable_version is None :
159+ version = fetch_version ()
160+ if version is None :
161+ return None
162+
163+ with cache_file .open (mode = "w" ) as f :
164+ timecode = int (time .time ()) + 86_400
165+ f .write (str (timecode ) + "\n " + str (version ))
166+ stable_version = version
167+
168+ if stable_version != __version__ :
163169 console .print (
164- f"You are using manim version [red]v{ __version__ } [/red], but version [green]v{ stable } [/green] is available." ,
170+ f"You are using manim version [red]v{ __version__ } [/red], but version [green]v{ stable_version } [/green] is available." ,
165171 )
166172 console .print (
167173 "You should consider upgrading via [yellow]pip install -U manim[/yellow]" ,
168174 )
169175
170176
171177def fetch_version () -> str | None :
178+ """Fetch latest manim version from PYPI-database"""
172179 import http .client
173180 import urllib .error
174181 import urllib .request
@@ -185,15 +192,17 @@ def fetch_version() -> str | None:
185192 logger .debug (f"{ e } : { warn_prompt } " )
186193 return None
187194 except json .JSONDecodeError :
188- logger .debug (f"Error while decoding JSON from [{ manim_info_url } ]: warn_prompt" )
195+ logger .debug (
196+ f"Error while decoding JSON from [{ manim_info_url } ]: { warn_prompt } "
197+ )
189198 return None
190199 else :
191200 return str (json_data ["info" ]["version" ])
192201
193202
194- def warn_and_change_deprecated_args (kwargs : dict [str , Any ]) -> None :
195- """Helper function to print info about deprecated functions
196- and mutate inserted dict to contain proper format
203+ def warn_and_change_deprecated_arguments (kwargs : dict [str , Any ]) -> None :
204+ """Helper function to print info about deprecated arguments
205+ and mutate inserted dictionary to use new format
197206 """
198207 if kwargs ["save_as_gif" ]:
199208 logger .warning ("--save_as_gif is deprecated, please use --format=gif instead!" )
@@ -210,11 +219,14 @@ def warn_and_change_deprecated_args(kwargs: dict[str, Any]) -> None:
210219
211220
212221def select_scenes (scene_classes : list [type [Scene ]]) -> list [type [Scene ]]:
213- """Collection of selection checks for inserted scenes"""
214- if not scene_classes :
215- logger .error (NO_SCENE_MESSAGE )
216- return []
217- elif config .write_all :
222+ """Assortment of selection functionality in which one or more Scenes are selected from list.
223+
224+ Parameters
225+ ----------
226+ scene_classes
227+ list of scene classes that
228+ """
229+ if config .write_all :
218230 return scene_classes
219231
220232 result = []
@@ -229,13 +241,14 @@ def select_scenes(scene_classes: list[type[Scene]]) -> list[type[Scene]]:
229241 logger .error (SCENE_NOT_FOUND_MESSAGE .format (scene_name ))
230242 if result :
231243 return result
244+
232245 if len (scene_classes ) == 1 :
233246 config .scene_names = [scene_classes [0 ].__name__ ]
234247 return [scene_classes [0 ]]
235248
236249 try :
237250 console .print (f"{ MULTIPLE_SCENES } :\n " , style = "underline white" )
238- scene_indices = prompt_user_with_choice ([a .__name__ for a in scene_classes ])
251+ scene_indices = prompt_user_with_list ([a .__name__ for a in scene_classes ])
239252 except Exception as e :
240253 logger .error (f"{ e } \n { INVALID_NUMBER_MESSAGE } " )
241254 sys .exit (2 )
@@ -248,22 +261,31 @@ def select_scenes(scene_classes: list[type[Scene]]) -> list[type[Scene]]:
248261 return classes
249262
250263
251- def solve_rendrered_scenes (file_path_input : str ) -> list [type [Scene ]]:
252- """Return scenes from file path or create CLI prompt for input"""
264+ def scenes_from_input (file_path_input : str ) -> list [type [Scene ]]:
265+ """Return scenes from file path or create CLI prompt for input
266+
267+ Parameters
268+ ----------
269+ file_path_input
270+ file path or '-' that will open a code prompt
271+ """
253272 from ...scene .scene import Scene
254273
255274 if file_path_input == "-" :
256275 try :
257276 code = code_input_prompt ()
258277 module = module_from_text (code )
259278 except Exception as e :
260- logger .error (f" Failed to create from input code: { e } " )
279+ logger .error (f"Failed to create from input code: { e } " )
261280 sys .exit (2 )
262281
263282 logger .info (INPUT_CODE_RENDER )
264283 else :
265284 module = module_from_file (Path (file_path_input ))
266285
267- scenes = search_classes_from_module (module , Scene )
268-
269- return select_scenes (scenes )
286+ try :
287+ scenes = search_classes_from_module (module , Scene )
288+ return select_scenes (scenes )
289+ except ValueError :
290+ logger .error (NO_SCENE_MESSAGE )
291+ return []
0 commit comments