From 6e1b006dcf1d9c2fb97ae183aed22a50870712b5 Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 17:42:42 -0800 Subject: [PATCH 01/14] Don't automatically copy python objects into javascript, add new PyProxy.shallowCopyToJavascript and deepCopyToJavascript apis --- src/core/pyproxy.c | 6 ++++++ src/core/python2js.c | 2 +- src/core/python2js.h | 13 ++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/pyproxy.c b/src/core/pyproxy.c index fb92b96d3fe..2137a7e14b6 100644 --- a/src/core/pyproxy.c +++ b/src/core/pyproxy.c @@ -210,6 +210,12 @@ EM_JS(int, pyproxy_init, (), { Module.hiwire.decref(idargs); return jsresult; }, + shallowCopyToJavascript : function(){ + return python2js_with_depth(_getPtr(this), 1); + }, + deepCopyToJavascript : function(depth = -1){ + return python2js_with_depth(_getPtr(this), depth); + }, }; let ignoredTargetFields = ["name", "length"]; diff --git a/src/core/python2js.c b/src/core/python2js.c index 47cabfa51cf..d189a3f5fd1 100644 --- a/src/core/python2js.c +++ b/src/core/python2js.c @@ -342,7 +342,7 @@ JsRef python2js(PyObject* x) { PyObject* map = PyDict_New(); - JsRef result = _python2js_cache(x, map, -1); + JsRef result = _python2js_cache(x, map, 0); Py_DECREF(map); if (result == NULL) { diff --git a/src/core/python2js.h b/src/core/python2js.h index cd3eb89da8c..280ee45b0a4 100644 --- a/src/core/python2js.h +++ b/src/core/python2js.h @@ -16,13 +16,24 @@ void pythonexc2js(); /** Convert a Python object to a Javascript object. - * \param The Python object + * \param x The Python object * \return The Javascript object -- might be an Error object in the case of an * exception. */ JsRef python2js(PyObject* x); + +/** Convert a Python object to a Javascript object, copying standard collections into javascript down to specified depth + * \param x The Python object + * \param depth The maximum depth to copy + * \return The Javascript object -- might be an Error object in the case of an + * exception. + */ +JsRef +python2js_with_depth(PyObject* x, int depth); + + /** Set up the global state for this module. */ int From e3fe09248b30cf514efd69d7208c96d8075b20ab Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 18:32:22 -0800 Subject: [PATCH 02/14] Lint --- src/core/python2js.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/core/python2js.h b/src/core/python2js.h index 280ee45b0a4..8371112b9b1 100644 --- a/src/core/python2js.h +++ b/src/core/python2js.h @@ -23,17 +23,14 @@ pythonexc2js(); JsRef python2js(PyObject* x); - -/** Convert a Python object to a Javascript object, copying standard collections into javascript down to specified depth - * \param x The Python object - * \param depth The maximum depth to copy - * \return The Javascript object -- might be an Error object in the case of an - * exception. +/** Convert a Python object to a Javascript object, copying standard collections + * into javascript down to specified depth \param x The Python object \param + * depth The maximum depth to copy \return The Javascript object -- might be an + * Error object in the case of an exception. */ JsRef python2js_with_depth(PyObject* x, int depth); - /** Set up the global state for this module. */ int From b84929c5aea0ce04bbd0621ddce3ef27544ef01f Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 18:35:30 -0800 Subject: [PATCH 03/14] Adjust conftest to automatically deep_copy results of run / run_async --- conftest.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/conftest.py b/conftest.py index 30ce01ed769..984f14200a8 100644 --- a/conftest.py +++ b/conftest.py @@ -95,10 +95,30 @@ def clean_logs(self): self.driver.execute_script("window.logs = []") def run(self, code): - return self.run_js("return pyodide.runPython({!r})".format(code)) + return self.run_js( + f""" + let result = pyodide.runPython({code!r}); + if(result.deepCopyToJavascript){{ + let converted_result = result.deepCopyToJavascript(); + result.destroy(); + return converted_result; + }} + return result; + """ + ) def run_async(self, code): - return self.run_js("return pyodide.runPythonAsync({!r})".format(code)) + return self.run_js( + f""" + let result = await pyodide.runPythonAsync({code!r}); + if(result.deepCopyToJavascript){{ + let converted_result = result.deepCopyToJavascript(); + result.destroy(); + return converted_result; + }} + return result; + """ + ) def run_js(self, code): if isinstance(code, str) and code.startswith("\n"): From 052658086ab8e02b8966328639795fceb6f1ea48 Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 19:17:20 -0800 Subject: [PATCH 04/14] Update conftest again --- conftest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conftest.py b/conftest.py index 984f14200a8..fb4acc38da2 100644 --- a/conftest.py +++ b/conftest.py @@ -98,7 +98,7 @@ def run(self, code): return self.run_js( f""" let result = pyodide.runPython({code!r}); - if(result.deepCopyToJavascript){{ + if(result && result.deepCopyToJavascript){{ let converted_result = result.deepCopyToJavascript(); result.destroy(); return converted_result; @@ -111,7 +111,7 @@ def run_async(self, code): return self.run_js( f""" let result = await pyodide.runPythonAsync({code!r}); - if(result.deepCopyToJavascript){{ + if(result && result.deepCopyToJavascript){{ let converted_result = result.deepCopyToJavascript(); result.destroy(); return converted_result; From 048ed93b8d202a3a66c9c0d907503c09dcf3f111 Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 19:56:35 -0800 Subject: [PATCH 05/14] Fix deep/shallowCopyToJavascript --- src/core/pyproxy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/pyproxy.c b/src/core/pyproxy.c index 2137a7e14b6..5c7251b5537 100644 --- a/src/core/pyproxy.c +++ b/src/core/pyproxy.c @@ -211,10 +211,10 @@ EM_JS(int, pyproxy_init, (), { return jsresult; }, shallowCopyToJavascript : function(){ - return python2js_with_depth(_getPtr(this), 1); + return _python2js_with_depth(_getPtr(this), 1); }, deepCopyToJavascript : function(depth = -1){ - return python2js_with_depth(_getPtr(this), depth); + return _python2js_with_depth(_getPtr(this), depth); }, }; From 0a9b97745e9a9100ce0f089111d8614ebdcfc79c Mon Sep 17 00:00:00 2001 From: Hood Date: Sun, 17 Jan 2021 21:23:08 -0800 Subject: [PATCH 06/14] Fix shallowCopyToJavascript and deepCopyToJavascript to return js object not hiwire id --- src/core/pyproxy.c | 10 ++++++++-- src/tests/test_jsproxy.py | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/pyproxy.c b/src/core/pyproxy.c index 5c7251b5537..ffb3227acd2 100644 --- a/src/core/pyproxy.c +++ b/src/core/pyproxy.c @@ -211,10 +211,16 @@ EM_JS(int, pyproxy_init, (), { return jsresult; }, shallowCopyToJavascript : function(){ - return _python2js_with_depth(_getPtr(this), 1); + let idresult = _python2js_with_depth(_getPtr(this), depth); + let result = Module.hiwire.get_value(idresult); + Module.hiwire.decref(idresult); + return result; }, deepCopyToJavascript : function(depth = -1){ - return _python2js_with_depth(_getPtr(this), depth); + let idresult = _python2js_with_depth(_getPtr(this), depth); + let result = Module.hiwire.get_value(idresult); + Module.hiwire.decref(idresult); + return result; }, }; diff --git a/src/tests/test_jsproxy.py b/src/tests/test_jsproxy.py index be4cb96ce84..4c2606837e0 100644 --- a/src/tests/test_jsproxy.py +++ b/src/tests/test_jsproxy.py @@ -499,7 +499,7 @@ def test_mount_object(selenium): import b result += [a.s, dir(a), dir(b)] result - `) + `).deepCopyToJavascript() """ ) assert result[:3] == ["x1", "x2", 3] From 180e184c9e6facc3b4f090cc4a170331f8d35f7a Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 09:09:39 -0800 Subject: [PATCH 07/14] Fix the remaining tests (hopefully) --- src/pyodide.js | 2 +- src/tests/test_jsproxy.py | 2 +- src/tests/test_pyproxy.py | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pyodide.js b/src/pyodide.js index ea89a7ac86c..c2ad4e7567b 100644 --- a/src/pyodide.js +++ b/src/pyodide.js @@ -340,7 +340,7 @@ globalThis.languagePluginLoader = new Promise((resolve, reject) => { // clang-format off Module.loadPackagesFromImports = async function(code, messageCallback, errorCallback) { - let imports = Module.pyodide_py.find_imports(code); + let imports = Module.pyodide_py.find_imports(code).deepCopyToJavascript(); if (imports.length === 0) { return; } diff --git a/src/tests/test_jsproxy.py b/src/tests/test_jsproxy.py index 4c2606837e0..ac51bbc1ddc 100644 --- a/src/tests/test_jsproxy.py +++ b/src/tests/test_jsproxy.py @@ -49,7 +49,7 @@ def test_jsproxy_getattr(selenium): return pyodide.runPython(` from js import a [ a.x, a.y, a.typeof ] - `); + `).deepCopyToJavascript(); """ ) == [2, "9", "object"] diff --git a/src/tests/test_pyproxy.py b/src/tests/test_pyproxy.py index fb3f5b71c7b..9ac10a8747d 100644 --- a/src/tests/test_pyproxy.py +++ b/src/tests/test_pyproxy.py @@ -55,6 +55,8 @@ def get_value(self, value): "apply", "destroy", "$$", + 'deepCopyToJavascript', + 'shallowCopyToJavascript', ] ) assert selenium.run("hasattr(f, 'baz')") From ea30e392cbaa0ea6d0f223e9a3823223bb7c3f2d Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 09:12:46 -0800 Subject: [PATCH 08/14] Lint --- src/tests/test_pyproxy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/test_pyproxy.py b/src/tests/test_pyproxy.py index 9ac10a8747d..532f5359842 100644 --- a/src/tests/test_pyproxy.py +++ b/src/tests/test_pyproxy.py @@ -55,8 +55,8 @@ def get_value(self, value): "apply", "destroy", "$$", - 'deepCopyToJavascript', - 'shallowCopyToJavascript', + "deepCopyToJavascript", + "shallowCopyToJavascript", ] ) assert selenium.run("hasattr(f, 'baz')") From 93cd13f853b5584d621db2003da7959a2bf07634 Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 12:48:30 -0800 Subject: [PATCH 09/14] Fix more tests --- src/tests/test_jsproxy.py | 4 ++-- src/tests/test_python.py | 2 +- src/tests/test_stdlib_fixes.py | 2 +- src/tests/test_typeconversions.py | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tests/test_jsproxy.py b/src/tests/test_jsproxy.py index ac51bbc1ddc..134a487978e 100644 --- a/src/tests/test_jsproxy.py +++ b/src/tests/test_jsproxy.py @@ -12,7 +12,7 @@ def test_jsproxy_dir(selenium): from js import a from js import b [dir(a), dir(b)] - `); + `).deepCopyToJavascript(); """ ) jsproxy_items = set( @@ -195,7 +195,7 @@ def test_jsproxy_call(selenium): from js import f [f(*range(n)) for n in range(10)] ` - ); + ).deepCopyToJavascript(); """ ) == list(range(10)) diff --git a/src/tests/test_python.py b/src/tests/test_python.py index 9713c818a35..c19e59f8379 100644 --- a/src/tests/test_python.py +++ b/src/tests/test_python.py @@ -172,5 +172,5 @@ def test_unknown_attribute(selenium): def test_run_python_debug(selenium): assert selenium.run_js("return pyodide._module.runPythonDebug('1+1');") == 2 assert selenium.run_js( - "return pyodide._module.runPythonDebug('[x*x + 1 for x in range(4)]');" + "return pyodide._module.runPythonDebug('[x*x + 1 for x in range(4)]').deepCopyToJavascript();" ) == [1, 2, 5, 10] diff --git a/src/tests/test_stdlib_fixes.py b/src/tests/test_stdlib_fixes.py index b29b668fece..07fb968e100 100644 --- a/src/tests/test_stdlib_fixes.py +++ b/src/tests/test_stdlib_fixes.py @@ -30,7 +30,7 @@ def test_threading_import(selenium): selenium.run( """ import threading - threading.local() + threading.local(); pass """ ) diff --git a/src/tests/test_typeconversions.py b/src/tests/test_typeconversions.py index d475c974970..55f98b7d3a8 100644 --- a/src/tests/test_typeconversions.py +++ b/src/tests/test_typeconversions.py @@ -22,14 +22,14 @@ def test_python2js(selenium): ) assert selenium.run_js( """ - let x = pyodide.runPython("[1, 2, 3]"); + let x = pyodide.runPython("[1, 2, 3]").deepCopyToJavascript(); return ((x instanceof window.Array) && (x.length === 3) && (x[0] == 1) && (x[1] == 2) && (x[2] == 3)) """ ) assert selenium.run_js( """ - let x = pyodide.runPython("{42: 64}"); + let x = pyodide.runPython("{42: 64}").deepCopyToJavascript(); return (typeof x === "object") && (x[42] === 64) """ ) @@ -230,7 +230,7 @@ def test_recursive_list_to_js(selenium_standalone): x.append(x) """ ) - selenium_standalone.run_js("x = pyodide.pyimport('x');") + selenium_standalone.run_js("x = pyodide.pyimport('x').deepCopyToJavascript();") def test_recursive_dict_to_js(selenium_standalone): @@ -240,7 +240,7 @@ def test_recursive_dict_to_js(selenium_standalone): x[0] = x """ ) - selenium_standalone.run_js("x = pyodide.pyimport('x');") + selenium_standalone.run_js("x = pyodide.pyimport('x').deepCopyToJavascript();") def test_list_from_js(selenium): From 141580370575a92bad5a5eca9555cbf90c6106bb Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 12:51:16 -0800 Subject: [PATCH 10/14] Fix some numpy tests --- packages/numpy/test_numpy.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/numpy/test_numpy.py b/packages/numpy/test_numpy.py index f4c1d3c1c98..495cf84fc42 100644 --- a/packages/numpy/test_numpy.py +++ b/packages/numpy/test_numpy.py @@ -4,9 +4,9 @@ def test_numpy(selenium): selenium.run("x = numpy.ones((32, 64))") assert selenium.run_js("return pyodide.pyimport('x').length == 32") for i in range(32): - assert selenium.run_js(f"return pyodide.pyimport('x')[{i}].length == 64") + assert selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}].length == 64") for j in range(64): - assert selenium.run_js(f"return pyodide.pyimport('x')[{i}][{j}] == 1") + assert selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}] == 1") def test_typed_arrays(selenium): @@ -48,7 +48,7 @@ def assert_equal(): for j in range(2): for k in range(2): assert ( - selenium.run_js(f"return pyodide.pyimport('x')[{i}][{j}][{k}]") + selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}][{k}]") == expected_result[i][j][k] ) @@ -176,7 +176,7 @@ def test_runpythonasync_numpy(selenium_standalone): """ ) for i in range(5): - assert selenium_standalone.run_js(f"return pyodide.pyimport('x')[{i}] == 0") + assert selenium_standalone.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}] == 0") def test_runwebworker_numpy(selenium_standalone): From 65585d710b27344e29a28a3f1a6e9b3410691f93 Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 12:54:53 -0800 Subject: [PATCH 11/14] Lint --- packages/numpy/test_numpy.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/numpy/test_numpy.py b/packages/numpy/test_numpy.py index 495cf84fc42..5d8a1db6dfc 100644 --- a/packages/numpy/test_numpy.py +++ b/packages/numpy/test_numpy.py @@ -4,9 +4,13 @@ def test_numpy(selenium): selenium.run("x = numpy.ones((32, 64))") assert selenium.run_js("return pyodide.pyimport('x').length == 32") for i in range(32): - assert selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}].length == 64") + assert selenium.run_js( + f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}].length == 64" + ) for j in range(64): - assert selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}] == 1") + assert selenium.run_js( + f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}] == 1" + ) def test_typed_arrays(selenium): @@ -48,7 +52,9 @@ def assert_equal(): for j in range(2): for k in range(2): assert ( - selenium.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}][{k}]") + selenium.run_js( + f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}][{j}][{k}]" + ) == expected_result[i][j][k] ) @@ -176,7 +182,9 @@ def test_runpythonasync_numpy(selenium_standalone): """ ) for i in range(5): - assert selenium_standalone.run_js(f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}] == 0") + assert selenium_standalone.run_js( + f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}] == 0" + ) def test_runwebworker_numpy(selenium_standalone): From 7d454b23a02d3921b8838c5614acfce6575d123b Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 14:04:21 -0800 Subject: [PATCH 12/14] Fix more tests --- packages/matplotlib/test_matplotlib.py | 8 ++++---- packages/numpy/test_numpy.py | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/matplotlib/test_matplotlib.py b/packages/matplotlib/test_matplotlib.py index b37e16fa13a..243575c80d9 100644 --- a/packages/matplotlib/test_matplotlib.py +++ b/packages/matplotlib/test_matplotlib.py @@ -2,15 +2,15 @@ def test_matplotlib(selenium_standalone): selenium = selenium_standalone selenium.load_package("matplotlib") selenium.run("from matplotlib import pyplot as plt") - selenium.run("plt.figure()") - selenium.run("plt.plot([1,2,3])") + selenium.run("plt.figure(); pass") + selenium.run("x = plt.plot([1,2,3])") selenium.run("plt.show()") def test_svg(selenium): selenium.load_package("matplotlib") selenium.run("from matplotlib import pyplot as plt") - selenium.run("plt.figure()") + selenium.run("plt.figure(); pass") selenium.run("x = plt.plot([1,2,3])") selenium.run("import io") selenium.run("fd = io.BytesIO()") @@ -23,7 +23,7 @@ def test_svg(selenium): def test_pdf(selenium): selenium.load_package("matplotlib") selenium.run("from matplotlib import pyplot as plt") - selenium.run("plt.figure()") + selenium.run("plt.figure(); pass") selenium.run("x = plt.plot([1,2,3])") selenium.run("import io") selenium.run("fd = io.BytesIO()") diff --git a/packages/numpy/test_numpy.py b/packages/numpy/test_numpy.py index 5d8a1db6dfc..034b74fb7be 100644 --- a/packages/numpy/test_numpy.py +++ b/packages/numpy/test_numpy.py @@ -2,7 +2,7 @@ def test_numpy(selenium): selenium.load_package("numpy") selenium.run("import numpy") selenium.run("x = numpy.ones((32, 64))") - assert selenium.run_js("return pyodide.pyimport('x').length == 32") + assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript().length == 32") for i in range(32): assert selenium.run_js( f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}].length == 64" @@ -80,7 +80,7 @@ def assert_equal(): ) assert_equal() classname = selenium.run_js( - "return pyodide.pyimport('x')[0][0].constructor.name" + "return pyodide.pyimport('x').deepCopyToJavascript()[0][0].constructor.name" ) if order == "C" and dtype not in ("uint64", "int64"): # Here we expect a TypedArray subclass, such as Uint8Array, but @@ -96,7 +96,7 @@ def assert_equal(): ) assert_equal() classname = selenium.run_js( - "return pyodide.pyimport('x')[0][0].constructor.name" + "return pyodide.pyimport('x').deepCopyToJavascript()[0][0].constructor.name" ) if order == "C" and dtype in ("int8", "uint8"): # Here we expect a TypedArray subclass, such as Uint8Array, but @@ -110,9 +110,9 @@ def assert_equal(): assert selenium.run("np.array([True, False])") == [True, False] selenium.run("x = np.array([['string1', 'string2'], ['string3', 'string4']])") - assert selenium.run_js("return pyodide.pyimport('x').length") == 2 - assert selenium.run_js("return pyodide.pyimport('x')[0][0]") == "string1" - assert selenium.run_js("return pyodide.pyimport('x')[1][1]") == "string4" + assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript().length") == 2 + assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[0][0]") == "string1" + assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[1][1]") == "string4" def test_py2js_buffer_clear_error_flag(selenium): From e15fedb470e266821d219dfe0588da43fc4e70c2 Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 14:06:17 -0800 Subject: [PATCH 13/14] Lint --- packages/numpy/test_numpy.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/numpy/test_numpy.py b/packages/numpy/test_numpy.py index 034b74fb7be..c46a1cb9939 100644 --- a/packages/numpy/test_numpy.py +++ b/packages/numpy/test_numpy.py @@ -2,7 +2,9 @@ def test_numpy(selenium): selenium.load_package("numpy") selenium.run("import numpy") selenium.run("x = numpy.ones((32, 64))") - assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript().length == 32") + assert selenium.run_js( + "return pyodide.pyimport('x').deepCopyToJavascript().length == 32" + ) for i in range(32): assert selenium.run_js( f"return pyodide.pyimport('x').deepCopyToJavascript()[{i}].length == 64" @@ -110,9 +112,18 @@ def assert_equal(): assert selenium.run("np.array([True, False])") == [True, False] selenium.run("x = np.array([['string1', 'string2'], ['string3', 'string4']])") - assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript().length") == 2 - assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[0][0]") == "string1" - assert selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[1][1]") == "string4" + assert ( + selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript().length") + == 2 + ) + assert ( + selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[0][0]") + == "string1" + ) + assert ( + selenium.run_js("return pyodide.pyimport('x').deepCopyToJavascript()[1][1]") + == "string4" + ) def test_py2js_buffer_clear_error_flag(selenium): From e10753d5d63bc093803050935023dbbc01ef5dda Mon Sep 17 00:00:00 2001 From: Hood Date: Mon, 18 Jan 2021 20:25:33 -0800 Subject: [PATCH 14/14] Temporarily dummy out setLineDash since it breaks test --- packages/matplotlib/src/wasm_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/matplotlib/src/wasm_backend.py b/packages/matplotlib/src/wasm_backend.py index a206b3c7276..e8a16279d3f 100644 --- a/packages/matplotlib/src/wasm_backend.py +++ b/packages/matplotlib/src/wasm_backend.py @@ -190,7 +190,7 @@ def ignore(event): rubberband.addEventListener("keydown", self.onkeydown) context = rubberband.getContext("2d") context.strokeStyle = "#000000" - context.setLineDash([2, 2]) + # context.setLineDash([2, 2]) canvas_div.appendChild(rubberband) div.appendChild(canvas_div)