mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-20 18:55:29 -05:00
As the title stays, the main goal of the branch is to kill the infamous runtimeLoaded global store and all the complications, problems and bugs caused by the fact that in many places we needed to ensure/wait that the global runtime was properly set before being able to execute code. The core idea is that runtime is never a global object and that it's passed around explicitly, which means that when a function receives it, it is guaranteed to be initialized&ready. This caused a bit of complications in pybutton.ts, pyinputbox.ts and pyrepl.ts, because they indirectly want to call runtime.run from connectedCallback, which is the only place where we cannot explicitly pass the runtime because it's automatically called by the browser. But also, it is also a sign of a bad design, because it were entirely possible that connectedCallback was called before the runtime was ready, which probably caused many bugs, see e.g. #673 and #747. The solution to is use dependency injection and create the class later on: so instead of having a global PyButton class which relies on a global runtime (whose state is uncertain) we have a make_PyButton function which takes a runtime and make a PyButton class which is tied to that specific runtime (whose state is certainly ready, because we call make_PyButton only when we know that the runtime is ready). Similar for PyInputBox and PyRepl. Other highlights: thanks to this, I could kill the also infamous runAfterRuntimeInitialized and a couple of smelly lines which used setTimeout to "wait" for the runtime. While I was at it, I also called a lot of other stores which were completely unused and where probably leftovers from a past universe.
100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
import re
|
|
|
|
from .support import PyScriptTest
|
|
|
|
|
|
class TestBasic(PyScriptTest):
|
|
def test_pyscript_hello(self):
|
|
self.pyscript_run(
|
|
"""
|
|
<py-script>
|
|
print('hello pyscript')
|
|
</py-script>
|
|
"""
|
|
)
|
|
# this is a very ugly way of checking the content of the DOM. If we
|
|
# find ourselves to write a lot of code in this style, we will
|
|
# probably want to write a nicer API for it.
|
|
inner_html = self.page.locator("py-script").inner_html()
|
|
pattern = r'<div id="py-.*">hello pyscript</div>'
|
|
assert re.search(pattern, inner_html)
|
|
|
|
def test_execution_in_order(self):
|
|
"""
|
|
Check that they py-script tags are executed in the same order they are
|
|
defined
|
|
"""
|
|
self.pyscript_run(
|
|
"""
|
|
<py-script>import js; js.console.log('one')</py-script>
|
|
<py-script>js.console.log('two')</py-script>
|
|
<py-script>js.console.log('three')</py-script>
|
|
<py-script>js.console.log('four')</py-script>
|
|
"""
|
|
)
|
|
assert self.console.log.lines == [
|
|
self.PY_COMPLETE,
|
|
"one",
|
|
"two",
|
|
"three",
|
|
"four",
|
|
]
|
|
|
|
def test_escaping_of_angle_brackets(self):
|
|
"""
|
|
Check that py-script tags escape angle brackets
|
|
"""
|
|
self.pyscript_run(
|
|
"""
|
|
<py-script>import js; js.console.log(1<2, 1>2)</py-script>
|
|
<py-script>js.console.log("<div></div>")</py-script>
|
|
"""
|
|
)
|
|
assert self.console.log.lines == [self.PY_COMPLETE, "true false", "<div></div>"]
|
|
|
|
def test_paths(self):
|
|
self.writefile("a.py", "x = 'hello from A'")
|
|
self.writefile("b.py", "x = 'hello from B'")
|
|
self.pyscript_run(
|
|
"""
|
|
<py-config>
|
|
paths = ["./a.py", "./b.py"]
|
|
</py-config>
|
|
|
|
<py-script>
|
|
import js
|
|
import a, b
|
|
js.console.log(a.x)
|
|
js.console.log(b.x)
|
|
</py-script>
|
|
"""
|
|
)
|
|
assert self.console.log.lines == [
|
|
self.PY_COMPLETE,
|
|
"hello from A",
|
|
"hello from B",
|
|
]
|
|
|
|
def test_packages(self):
|
|
self.pyscript_run(
|
|
"""
|
|
<py-config>
|
|
# we use asciitree because it's one of the smallest packages
|
|
# which are built and distributed with pyodide
|
|
packages = ["asciitree"]
|
|
</py-config>
|
|
|
|
<py-script>
|
|
import js
|
|
import asciitree
|
|
js.console.log('hello', asciitree.__name__)
|
|
</py-script>
|
|
"""
|
|
)
|
|
assert self.console.log.lines == [
|
|
self.PY_COMPLETE,
|
|
"Loading asciitree", # printed by pyodide
|
|
"Loaded asciitree", # printed by pyodide
|
|
"hello asciitree", # printed by us
|
|
]
|