11import os .path
2- from collections import OrderedDict
32
3+ import execjs .runtime_names as runtime_names
44import execjs ._external_runtime as external_runtime
55import execjs ._pyv8runtime as pyv8runtime
66import execjs ._exceptions as exceptions
77
88
99def register (name , runtime ):
1010 '''Register a JavaScript runtime.'''
11- _runtimes [ name ] = runtime
11+ _runtimes . append (( name , runtime ))
1212
1313
1414def get (name = None ):
@@ -17,17 +17,8 @@ def get(name=None):
1717 If name is specified, return the runtime.
1818 """
1919 if name is None :
20- return _auto_detect ()
21-
22- try :
23- runtime = runtimes ()[name ]
24- except KeyError :
25- raise exceptions .RuntimeUnavailableError ("{name} runtime is not defined" .format (name = name ))
26- else :
27- if not runtime .is_available ():
28- raise exceptions .RuntimeUnavailableError (
29- "{name} runtime is not available on this system" .format (name = runtime .name ))
30- return runtime
20+ return get_from_environment () or _find_available_runtime ()
21+ return _find_runtime_by_name (name )
3122
3223
3324def runtimes ():
@@ -37,49 +28,56 @@ def runtimes():
3728
3829def available_runtimes ():
3930 """return a dictionary of all supported JavaScript runtimes which is usable"""
40- return dict ((name , runtime ) for name , runtime in _runtimes .items () if runtime .is_available ())
41-
42-
43- def _auto_detect ():
44- runtime = get_from_environment ()
45- if runtime is not None :
46- return runtime
47-
48- for runtime in _runtimes .values ():
49- if runtime .is_available ():
50- return runtime
51-
52- raise exceptions .RuntimeUnavailableError ("Could not find a JavaScript runtime." )
31+ return dict ((name , runtime ) for name , runtime in _runtimes if runtime .is_available ())
5332
5433
5534def get_from_environment ():
5635 '''
5736 Return the JavaScript runtime that is specified in EXECJS_RUNTIME environment variable.
5837 If EXECJS_RUNTIME environment variable is empty or invalid, return None.
5938 '''
60- try :
61- name = os .environ ["EXECJS_RUNTIME" ]
62- except KeyError :
39+ name = os .environ .get ("EXECJS_RUNTIME" , "" )
40+ if not name :
6341 return None
6442
65- if not name :
43+ try :
44+ return _find_runtime_by_name (name )
45+ except exceptions .RuntimeUnavailableError :
6646 return None
67- return get (name )
6847
6948
70- _runtimes = OrderedDict ()
49+ def _find_available_runtime ():
50+ for _ , runtime in _runtimes :
51+ if runtime .is_available ():
52+ return runtime
53+ raise exceptions .RuntimeUnavailableError ("Could not find an available JavaScript runtime." )
54+
55+
56+ def _find_runtime_by_name (name ):
57+ for runtime_name , runtime in _runtimes :
58+ if runtime_name .lower () == name .lower ():
59+ break
60+ else :
61+ raise exceptions .RuntimeUnavailableError ("{name} runtime is not defined" .format (name = name ))
62+
63+ if not runtime .is_available ():
64+ raise exceptions .RuntimeUnavailableError (
65+ "{name} runtime is not available on this system" .format (name = runtime .name ))
66+ return runtime
67+
68+
69+ _runtimes = []
7170
72- register (' PyV8' , pyv8runtime .PyV8Runtime ())
71+ register (runtime_names . PyV8 , pyv8runtime .PyV8Runtime ())
7372
7473if external_runtime .node .is_available ():
75- register (" Node" , external_runtime .node )
74+ register (runtime_names . Node , external_runtime .node )
7675else :
77- register ("Node" , external_runtime .nodejs )
78-
79- register ('JavaScriptCore' , external_runtime .jsc )
80- register ('SpiderMonkey' , external_runtime .spidermonkey )
81- register ('Spidermonkey' , external_runtime .spidermonkey )
82- register ('JScript' , external_runtime .jscript )
83- register ("PhantomJS" , external_runtime .phantomjs )
84- register ("SlimerJS" , external_runtime .slimerjs )
85- register ('Nashorn' , external_runtime .nashorn )
76+ register (runtime_names .Node , external_runtime .nodejs )
77+
78+ register (runtime_names .JavaScriptCore , external_runtime .jsc )
79+ register (runtime_names .SpiderMonkey , external_runtime .spidermonkey )
80+ register (runtime_names .JScript , external_runtime .jscript )
81+ register (runtime_names .PhantomJS , external_runtime .phantomjs )
82+ register (runtime_names .SlimerJS , external_runtime .slimerjs )
83+ register (runtime_names .Nashorn , external_runtime .nashorn )
0 commit comments