Skip to content

Commit 0b907cf

Browse files
committed
threejs: access files through features, for simpler configuration
1 parent 469a087 commit 0b907cf

File tree

4 files changed

+59
-6
lines changed

4 files changed

+59
-6
lines changed

src/sage/env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def var(key: str, *fallbacks: Optional[str], force: bool = False) -> Optional[st
214214
JMOL_DIR = var("JMOL_DIR")
215215
MATHJAX_DIR = var("MATHJAX_DIR", join(SAGE_SHARE, "mathjax"))
216216
MTXLIB = var("MTXLIB", join(SAGE_SHARE, "meataxe"))
217-
THREEJS_DIR = var("THREEJS_DIR", join(SAGE_SHARE, "threejs-sage"))
217+
THREEJS_DIR = var("THREEJS_DIR")
218218
PPLPY_DOCS = var("PPLPY_DOCS", join(SAGE_SHARE, "doc", "pplpy"))
219219
MAXIMA = var("MAXIMA", "maxima")
220220
MAXIMA_FAS = var("MAXIMA_FAS")

src/sage/features/threejs.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import os
2+
3+
from . import StaticFile
4+
5+
6+
class Threejs(StaticFile):
7+
r"""
8+
A :class:`~sage.features.Feature` which describes the presence of
9+
threejs-sage in a few standard locations.
10+
11+
EXAMPLES::
12+
13+
sage: from sage.features.threejs import Threejs
14+
sage: bool(Threejs().is_present()) # needs threejs
15+
True
16+
"""
17+
18+
def __init__(self):
19+
r"""
20+
TESTS::
21+
22+
sage: from sage.features.threejs import Threejs
23+
sage: isinstance(Threejs(), Threejs)
24+
True
25+
"""
26+
from sage.env import SAGE_SHARE, THREEJS_DIR
27+
from sage.repl.rich_output import display_manager
28+
29+
version = display_manager._required_threejs_version()
30+
31+
threejs_search_path = THREEJS_DIR or (
32+
os.path.join(SAGE_SHARE, "jupyter", "nbextension", "threejs-sage"),
33+
os.path.join(SAGE_SHARE, "sagemath", "threejs-sage"),
34+
os.path.join(SAGE_SHARE, "threejs-sage")
35+
)
36+
37+
StaticFile.__init__(
38+
self, name="threejs",
39+
filename=os.path.join(version, "three.min.js"),
40+
spkg="threejs",
41+
type="standard",
42+
search_path=threejs_search_path,
43+
description="JavaScript library to display 3D graphics")
44+
45+
46+
def all_features():
47+
return [Threejs()]

src/sage/repl/ipython_kernel/install.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
SAGE_EXTCODE,
2424
SAGE_VENV,
2525
SAGE_VERSION,
26-
THREEJS_DIR,
2726
)
2827

2928

@@ -123,14 +122,18 @@ def use_local_threejs(self):
123122
124123
EXAMPLES::
125124
125+
sage: # needs threejs
126126
sage: from sage.repl.ipython_kernel.install import SageKernelSpec
127127
sage: spec = SageKernelSpec(prefix=tmp_dir())
128128
sage: spec.use_local_threejs()
129129
sage: threejs = os.path.join(spec.nbextensions_dir, 'threejs-sage')
130130
sage: os.path.isdir(threejs)
131131
True
132132
"""
133-
src = THREEJS_DIR
133+
from sage.features.threejs import Threejs
134+
if not Threejs().is_present():
135+
return
136+
src = os.path.dirname(os.path.dirname(Threejs().absolute_filename()))
134137
dst = os.path.join(self.nbextensions_dir, 'threejs-sage')
135138
self.symlink(src, dst)
136139

src/sage/repl/rich_output/backend_ipython.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,18 @@ def threejs_offline_scripts(self):
409409
410410
EXAMPLES::
411411
412+
sage: # needs threejs
412413
sage: from sage.repl.rich_output.backend_ipython import BackendIPythonCommandline
413414
sage: backend = BackendIPythonCommandline()
414-
sage: backend.threejs_offline_scripts() # needs sage.plot
415+
sage: backend.threejs_offline_scripts()
415416
'...<script ...</script>...'
416417
"""
417-
from sage.env import THREEJS_DIR
418+
from sage.features.threejs import Threejs
418419
from sage.repl.rich_output.display_manager import _required_threejs_version
420+
if not Threejs().is_present():
421+
return ''
419422

420-
script = os.path.join(THREEJS_DIR, '{}/three.min.js'.format(_required_threejs_version()))
423+
script = Threejs().absolute_filename()
421424

422425
return '\n<script src="{0}"></script>'.format(script)
423426

0 commit comments

Comments
 (0)