Skip to content
This repository was archived by the owner on Jan 1, 2021. It is now read-only.

Commit ce6c4d3

Browse files
committed
Added execjs.runtime_names
1 parent 74cf794 commit ce6c4d3

File tree

3 files changed

+53
-45
lines changed

3 files changed

+53
-45
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ You can choose JavaScript runtime by `execjs.get()`:
5353
>>> default = execjs.get() # the automatically picked runtime
5454
>>> default.eval("1 + 2")
5555
3
56-
>>> jscript = execjs.get("JScript")
56+
>>> import execjs.runtime_names
57+
>>> jscript = execjs.get(execjs.runtime_names.JScript)
5758
>>> jscript.eval("1 + 2")
5859
3
59-
>>> node = execjs.get("Node")
60+
>>> import execjs.runtime_names
61+
>>> node = execjs.get(execjs.runtime_names.Node)
6062
>>> node.eval("1 + 2")
6163
3
6264

execjs/_runtimes.py

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import os.path
2-
from collections import OrderedDict
32

3+
import execjs.runtime_names as runtime_names
44
import execjs._external_runtime as external_runtime
55
import execjs._pyv8runtime as pyv8runtime
66
import execjs._exceptions as exceptions
77

88

99
def register(name, runtime):
1010
'''Register a JavaScript runtime.'''
11-
_runtimes[name] = runtime
11+
_runtimes.append((name, runtime))
1212

1313

1414
def 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

3324
def runtimes():
@@ -37,49 +28,56 @@ def runtimes():
3728

3829
def 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

5534
def 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

7473
if external_runtime.node.is_available():
75-
register("Node", external_runtime.node)
74+
register(runtime_names.Node, external_runtime.node)
7675
else:
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)

execjs/runtime_names.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
PyV8 = "PyV8"
2+
Node = "Node"
3+
JavaScriptCore = "JavaScriptCore"
4+
SpiderMonkey = "SpiderMonkey"
5+
JScript = "JScript"
6+
PhantomJS = "PhantomJS"
7+
SlimerJS = "SlimerJS"
8+
Nashorn = "Nashorn"

0 commit comments

Comments
 (0)