26
26
logger ,
27
27
tempconfig ,
28
28
)
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
30
30
from manim .cli .render .ease_of_access_options import ease_of_access_options
31
31
from manim .cli .render .global_options import global_options
32
32
from manim .cli .render .output_options import output_options
@@ -92,15 +92,15 @@ def render(**kwargs: Any) -> ClickArgs | dict[str, Any]:
92
92
93
93
SCENES is an optional list of scenes in the file.
94
94
"""
95
- warn_and_change_deprecated_args (kwargs )
95
+ warn_and_change_deprecated_arguments (kwargs )
96
96
97
97
click_args = ClickArgs (kwargs )
98
98
if kwargs ["jupyter" ]:
99
99
return click_args
100
100
101
101
config .digest_args (click_args )
102
102
103
- scenes = solve_rendrered_scenes (config .input_file )
103
+ scenes = scenes_from_input (config .input_file )
104
104
105
105
if config .renderer == RendererType .OPENGL :
106
106
from manim .renderer .opengl_renderer import OpenGLRenderer
@@ -142,33 +142,40 @@ def render(**kwargs: Any) -> ClickArgs | dict[str, Any]:
142
142
143
143
144
144
def 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__ :
163
169
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." ,
165
171
)
166
172
console .print (
167
173
"You should consider upgrading via [yellow]pip install -U manim[/yellow]" ,
168
174
)
169
175
170
176
171
177
def fetch_version () -> str | None :
178
+ """Fetch latest manim version from PYPI-database"""
172
179
import http .client
173
180
import urllib .error
174
181
import urllib .request
@@ -185,15 +192,17 @@ def fetch_version() -> str | None:
185
192
logger .debug (f"{ e } : { warn_prompt } " )
186
193
return None
187
194
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
+ )
189
198
return None
190
199
else :
191
200
return str (json_data ["info" ]["version" ])
192
201
193
202
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
197
206
"""
198
207
if kwargs ["save_as_gif" ]:
199
208
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:
210
219
211
220
212
221
def 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 :
218
230
return scene_classes
219
231
220
232
result = []
@@ -229,13 +241,14 @@ def select_scenes(scene_classes: list[type[Scene]]) -> list[type[Scene]]:
229
241
logger .error (SCENE_NOT_FOUND_MESSAGE .format (scene_name ))
230
242
if result :
231
243
return result
244
+
232
245
if len (scene_classes ) == 1 :
233
246
config .scene_names = [scene_classes [0 ].__name__ ]
234
247
return [scene_classes [0 ]]
235
248
236
249
try :
237
250
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 ])
239
252
except Exception as e :
240
253
logger .error (f"{ e } \n { INVALID_NUMBER_MESSAGE } " )
241
254
sys .exit (2 )
@@ -248,22 +261,31 @@ def select_scenes(scene_classes: list[type[Scene]]) -> list[type[Scene]]:
248
261
return classes
249
262
250
263
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
+ """
253
272
from ...scene .scene import Scene
254
273
255
274
if file_path_input == "-" :
256
275
try :
257
276
code = code_input_prompt ()
258
277
module = module_from_text (code )
259
278
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 } " )
261
280
sys .exit (2 )
262
281
263
282
logger .info (INPUT_CODE_RENDER )
264
283
else :
265
284
module = module_from_file (Path (file_path_input ))
266
285
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