@pyscript/core 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{codemirror-CcGcOibd.js → codemirror-DhfqJnow.js} +2 -2
- package/dist/{codemirror-CcGcOibd.js.map → codemirror-DhfqJnow.js.map} +1 -1
- package/dist/{codemirror_commands-7YlBSWsE.js → codemirror_commands-aDUdtLV0.js} +2 -2
- package/dist/{codemirror_commands-7YlBSWsE.js.map → codemirror_commands-aDUdtLV0.js.map} +1 -1
- package/dist/{codemirror_lang-python-DTyea3yJ.js → codemirror_lang-python-DbjDBf6C.js} +2 -2
- package/dist/{codemirror_lang-python-DTyea3yJ.js.map → codemirror_lang-python-DbjDBf6C.js.map} +1 -1
- package/dist/{codemirror_language-CGC3ORqm.js → codemirror_language-C7NTiYFF.js} +2 -2
- package/dist/{codemirror_language-CGC3ORqm.js.map → codemirror_language-C7NTiYFF.js.map} +1 -1
- package/dist/codemirror_view-Bc_iulwl.js +2 -0
- package/dist/codemirror_view-Bc_iulwl.js.map +1 -0
- package/dist/core-DG5cWfnq.js +4 -0
- package/dist/core-DG5cWfnq.js.map +1 -0
- package/dist/core.js +1 -1
- package/dist/{deprecations-manager-BZMyPh9Z.js → deprecations-manager-Kkwj7uxq.js} +2 -2
- package/dist/{deprecations-manager-BZMyPh9Z.js.map → deprecations-manager-Kkwj7uxq.js.map} +1 -1
- package/dist/{donkey-DLTHqMyf.js → donkey-CnugBzSW.js} +2 -2
- package/dist/{donkey-DLTHqMyf.js.map → donkey-CnugBzSW.js.map} +1 -1
- package/dist/{error-DN9B1zsm.js → error-WAkuD3Ml.js} +2 -2
- package/dist/{error-DN9B1zsm.js.map → error-WAkuD3Ml.js.map} +1 -1
- package/dist/{index-BHhYCC-h.js → index-DElqkBi5.js} +2 -2
- package/dist/{index-BHhYCC-h.js.map → index-DElqkBi5.js.map} +1 -1
- package/dist/{mpy-OB29ogab.js → mpy-DSOSxxXp.js} +2 -2
- package/dist/{mpy-OB29ogab.js.map → mpy-DSOSxxXp.js.map} +1 -1
- package/dist/{py-CEFrFkgS.js → py-0_0OQQA0.js} +2 -2
- package/dist/{py-CEFrFkgS.js.map → py-0_0OQQA0.js.map} +1 -1
- package/dist/{py-editor-BJhOS2If.js → py-editor-CmVF6SYN.js} +2 -2
- package/dist/{py-editor-BJhOS2If.js.map → py-editor-CmVF6SYN.js.map} +1 -1
- package/dist/{py-game-BCFyEV6Z.js → py-game-CIa4j_D5.js} +2 -2
- package/dist/{py-game-BCFyEV6Z.js.map → py-game-CIa4j_D5.js.map} +1 -1
- package/dist/{py-terminal-Dgce0Nz0.js → py-terminal-D7nbEhCT.js} +2 -2
- package/dist/{py-terminal-Dgce0Nz0.js.map → py-terminal-D7nbEhCT.js.map} +1 -1
- package/dist/zip-D8wJncBv.js +2 -0
- package/dist/zip-D8wJncBv.js.map +1 -0
- package/package.json +3 -3
- package/src/plugins/py-editor.js +3 -2
- package/src/stdlib/pyscript/events.py +11 -45
- package/src/stdlib/pyscript.js +1 -1
- package/dist/codemirror_view-C6Wj-LSg.js +0 -2
- package/dist/codemirror_view-C6Wj-LSg.js.map +0 -1
- package/dist/core-ZMJWBPuU.js +0 -4
- package/dist/core-ZMJWBPuU.js.map +0 -1
- package/dist/zip-CnaQd2o5.js +0 -2
- package/dist/zip-CnaQd2o5.js.map +0 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@pyscript/core",
|
3
|
-
"version": "0.7.
|
3
|
+
"version": "0.7.2",
|
4
4
|
"type": "module",
|
5
5
|
"description": "PyScript",
|
6
6
|
"module": "./index.js",
|
@@ -70,7 +70,7 @@
|
|
70
70
|
"@webreflection/utils": "^0.1.1",
|
71
71
|
"add-promise-listener": "^0.1.3",
|
72
72
|
"basic-devtools": "^0.1.6",
|
73
|
-
"polyscript": "^0.19.
|
73
|
+
"polyscript": "^0.19.3",
|
74
74
|
"sticky-module": "^0.1.1",
|
75
75
|
"to-json-callback": "^0.1.1",
|
76
76
|
"type-checked-collections": "^0.1.7"
|
@@ -80,7 +80,7 @@
|
|
80
80
|
"@codemirror/lang-python": "^6.2.1",
|
81
81
|
"@codemirror/language": "^6.11.3",
|
82
82
|
"@codemirror/state": "^6.5.2",
|
83
|
-
"@codemirror/view": "^6.38.
|
83
|
+
"@codemirror/view": "^6.38.5",
|
84
84
|
"@playwright/test": "^1.56.0",
|
85
85
|
"@rollup/plugin-commonjs": "^28.0.6",
|
86
86
|
"@rollup/plugin-node-resolve": "^16.0.2",
|
package/src/plugins/py-editor.js
CHANGED
@@ -426,16 +426,17 @@ const init = async (script, type, interpreter) => {
|
|
426
426
|
// preserve user indentation, if any
|
427
427
|
const indentation = /^([ \t]+)/m.test(doc) ? RegExp.$1 : " ";
|
428
428
|
|
429
|
-
const listener = () => runButton.click();
|
429
|
+
const listener = () => !runButton.click();
|
430
430
|
const editor = new EditorView({
|
431
431
|
extensions: [
|
432
432
|
indentUnit.of(indentation),
|
433
433
|
new Compartment().of(python()),
|
434
434
|
keymap.of([
|
435
|
-
...defaultKeymap,
|
436
435
|
{ key: "Ctrl-Enter", run: listener, preventDefault: true },
|
437
436
|
{ key: "Cmd-Enter", run: listener, preventDefault: true },
|
438
437
|
{ key: "Shift-Enter", run: listener, preventDefault: true },
|
438
|
+
// Consider removing defaultKeymap as likely redundant with basicSetup
|
439
|
+
...defaultKeymap,
|
439
440
|
// @see https://codemirror.net/examples/tab/
|
440
441
|
indentWithTab,
|
441
442
|
]),
|
@@ -92,60 +92,26 @@ def when(target, *args, **kwargs):
|
|
92
92
|
elements = selector if isinstance(selector, list) else [selector]
|
93
93
|
|
94
94
|
def decorator(func):
|
95
|
-
|
95
|
+
sig = inspect.signature(func)
|
96
|
+
if sig.parameters:
|
96
97
|
if is_awaitable(func):
|
97
98
|
|
98
|
-
async def wrapper(
|
99
|
-
|
100
|
-
This is a very ugly hack to get micropython working because
|
101
|
-
`inspect.signature` doesn't exist. It may be actually better
|
102
|
-
to not try any magic for now and raise the error.
|
103
|
-
"""
|
104
|
-
try:
|
105
|
-
return await func(*args, **kwargs)
|
106
|
-
|
107
|
-
except TypeError as e:
|
108
|
-
if "takes" in str(e) and "positional arguments" in str(e):
|
109
|
-
return await func()
|
110
|
-
raise
|
99
|
+
async def wrapper(event):
|
100
|
+
return await func(event)
|
111
101
|
|
112
102
|
else:
|
113
|
-
|
114
|
-
def wrapper(*args, **kwargs):
|
115
|
-
"""
|
116
|
-
This is a very ugly hack to get micropython working because
|
117
|
-
`inspect.signature` doesn't exist. It may be actually better
|
118
|
-
to not try any magic for now and raise the error.
|
119
|
-
"""
|
120
|
-
try:
|
121
|
-
return func(*args, **kwargs)
|
122
|
-
|
123
|
-
except TypeError as e:
|
124
|
-
if "takes" in str(e) and "positional arguments" in str(e):
|
125
|
-
return func()
|
126
|
-
raise
|
127
|
-
|
103
|
+
wrapper = func
|
128
104
|
else:
|
129
|
-
|
130
|
-
if
|
131
|
-
if is_awaitable(func):
|
105
|
+
# Function doesn't receive events.
|
106
|
+
if is_awaitable(func):
|
132
107
|
|
133
|
-
|
134
|
-
|
108
|
+
async def wrapper(*args, **kwargs):
|
109
|
+
return await func()
|
135
110
|
|
136
|
-
else:
|
137
|
-
wrapper = func
|
138
111
|
else:
|
139
|
-
# Function doesn't receive events.
|
140
|
-
if is_awaitable(func):
|
141
|
-
|
142
|
-
async def wrapper(*args, **kwargs):
|
143
|
-
return await func()
|
144
112
|
|
145
|
-
|
146
|
-
|
147
|
-
def wrapper(*args, **kwargs):
|
148
|
-
return func()
|
113
|
+
def wrapper(*args, **kwargs):
|
114
|
+
return func()
|
149
115
|
|
150
116
|
wrapper = wraps(func)(wrapper)
|
151
117
|
if isinstance(target, Event):
|
package/src/stdlib/pyscript.js
CHANGED
@@ -3,7 +3,7 @@ export default {
|
|
3
3
|
"pyscript": {
|
4
4
|
"__init__.py": "from polyscript import lazy_py_modules as py_import\nfrom pyscript.magic_js import RUNNING_IN_WORKER,PyWorker,config,current_target,document,js_import,js_modules,sync,window\nfrom pyscript.display import HTML,display\nfrom pyscript.fetch import fetch\nfrom pyscript.storage import Storage,storage\nfrom pyscript.websocket import WebSocket\nfrom pyscript.events import when,Event\nif not RUNNING_IN_WORKER:from pyscript.workers import create_named_worker,workers",
|
5
5
|
"display.py": "_K='_repr_mimebundle_'\n_J='image/svg+xml'\n_I='application/json'\n_H='__repr__'\n_G='savefig'\n_F='text/html'\n_E='image/jpeg'\n_D='application/javascript'\n_C='utf-8'\n_B='text/plain'\n_A='image/png'\nimport base64,html,io,re\nfrom pyscript.magic_js import current_target,document,window\nfrom pyscript.ffi import is_none\n_MIME_METHODS={_G:_A,'_repr_javascript_':_D,'_repr_json_':_I,'_repr_latex':'text/latex','_repr_png_':_A,'_repr_jpeg_':_E,'_repr_pdf_':'application/pdf','_repr_svg_':_J,'_repr_markdown_':'text/markdown','_repr_html_':_F,_H:_B}\ndef _render_image(mime,value,meta):\n\tA=value\n\tif isinstance(A,bytes):A=base64.b64encode(A).decode(_C)\n\tB=re.compile('^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$')\n\tif len(A)>0 and not B.match(A):A=base64.b64encode(A.encode(_C)).decode(_C)\n\tC=f\"data:{mime};charset=utf-8;base64,{A}\";D=' '.join(['{k}=\"{v}\"'for(A,B)in meta.items()]);return f'<img src=\"{C}\" {D}></img>'\ndef _identity(value,meta):return value\n_MIME_RENDERERS={_B:html.escape,_F:_identity,_A:lambda value,meta:_render_image(_A,value,meta),_E:lambda value,meta:_render_image(_E,value,meta),_J:_identity,_I:_identity,_D:lambda value,meta:f\"<script>{value}<\\\\/script>\"}\nclass HTML:\n\tdef __init__(A,html):A._html=html\n\tdef _repr_html_(A):return A._html\ndef _eval_formatter(obj,print_method):\n\tB=obj;A=print_method\n\tif A==_H:return repr(B)\n\tif hasattr(B,A):\n\t\tif A==_G:C=io.BytesIO();B.savefig(C,format='png');C.seek(0);return base64.b64encode(C.read()).decode(_C)\n\t\treturn getattr(B,A)()\n\tif A==_K:return{},{}\ndef _format_mime(obj):\n\tC=obj\n\tif isinstance(C,str):return html.escape(C),_B\n\tD=_eval_formatter(C,_K)\n\tif isinstance(D,tuple):E,I=D\n\telse:E=D\n\tA,F=None,[]\n\tfor(H,B)in _MIME_METHODS.items():\n\t\tif B in E:A=E[B]\n\t\telse:A=_eval_formatter(C,H)\n\t\tif is_none(A):continue\n\t\tif B not in _MIME_RENDERERS:F.append(B);continue\n\t\tbreak\n\tif is_none(A):\n\t\tif F:window.console.warn(f\"Rendered object requested unavailable MIME renderers: {F}\")\n\t\tA=repr(A);B=_B\n\telif isinstance(A,tuple):A,G=A\n\telse:G={}\n\treturn _MIME_RENDERERS[B](A,G),B\ndef _write(element,value,append=False):\n\tB=element;C,D=_format_mime(value)\n\tif C=='\\\\n':return\n\tif append:A=document.createElement('div');B.append(A)\n\telse:\n\t\tA=B.lastElementChild\n\t\tif is_none(A):A=B\n\tif D in(_D,_F):E=document.createRange().createContextualFragment(C);A.append(E)\n\telse:A.innerHTML=C\ndef display(*E,target=None,append=True):\n\tD=append;A=target\n\tif is_none(A):A=current_target()\n\telif not isinstance(A,str):C=f\"target must be str or None, not {A.__class__.__name__}\";raise TypeError(C)\n\telif A=='':C='Cannot have an empty target';raise ValueError(C)\n\telif A.startswith('#'):A=A[1:]\n\tB=document.getElementById(A)\n\tif is_none(B):C=f\"Invalid selector with id={A}. Cannot be found in the page.\";raise ValueError(C)\n\tif B.tagName=='SCRIPT'and hasattr(B,'target'):B=B.target\n\tfor F in E:\n\t\tif not D:B.replaceChildren()\n\t\t_write(B,F,append=D)",
|
6
|
-
"events.py": "import asyncio,inspect,sys\nfrom functools import wraps\nfrom pyscript.magic_js import document\nfrom pyscript.ffi import create_proxy\nfrom pyscript.util import is_awaitable\nfrom pyscript import config\nclass Event:\n\tdef __init__(A):A._listeners=[]\n\tdef trigger(C,result):\n\t\tB=result\n\t\tfor A in C._listeners:\n\t\t\tif is_awaitable(A):asyncio.create_task(A(B))\n\t\t\telse:A(B)\n\tdef add_listener(B,listener):\n\t\tA=listener\n\t\tif is_awaitable(A)or callable(A):\n\t\t\tif A not in B._listeners:B._listeners.append(A)\n\t\telse:C='Listener must be callable or awaitable.';raise ValueError(C)\n\tdef remove_listener(A,*B):\n\t\tif B:\n\t\t\tfor C in B:A._listeners.remove(C)\n\t\telse:A._listeners=[]\ndef when(target,*B,**D):\n\tG='handler';C=target;E=None\n\tif B and(callable(B[0])or is_awaitable(B[0])):E=B[0]\n\telif callable(D.get(G))or is_awaitable(D.get(G)):E=D.pop(G)\n\tif isinstance(C,str):\n\t\tA=B[0]if B else D.pop('selector')\n\t\tif not A:I='No selector provided.';raise ValueError(I)\n\t\tfrom pyscript.web import Element as J,ElementCollection as K\n\t\tif isinstance(A,str):F=document.querySelectorAll(A)\n\t\telif isinstance(A,J):F=[A._dom_element]\n\t\telif isinstance(A,K):F=[A._dom_element for A in A]\n\t\telse:F=A if isinstance(A,list)else[A]\n\tdef H(func):\n\t\
|
6
|
+
"events.py": "import asyncio,inspect,sys\nfrom functools import wraps\nfrom pyscript.magic_js import document\nfrom pyscript.ffi import create_proxy\nfrom pyscript.util import is_awaitable\nfrom pyscript import config\nclass Event:\n\tdef __init__(A):A._listeners=[]\n\tdef trigger(C,result):\n\t\tB=result\n\t\tfor A in C._listeners:\n\t\t\tif is_awaitable(A):asyncio.create_task(A(B))\n\t\t\telse:A(B)\n\tdef add_listener(B,listener):\n\t\tA=listener\n\t\tif is_awaitable(A)or callable(A):\n\t\t\tif A not in B._listeners:B._listeners.append(A)\n\t\telse:C='Listener must be callable or awaitable.';raise ValueError(C)\n\tdef remove_listener(A,*B):\n\t\tif B:\n\t\t\tfor C in B:A._listeners.remove(C)\n\t\telse:A._listeners=[]\ndef when(target,*B,**D):\n\tG='handler';C=target;E=None\n\tif B and(callable(B[0])or is_awaitable(B[0])):E=B[0]\n\telif callable(D.get(G))or is_awaitable(D.get(G)):E=D.pop(G)\n\tif isinstance(C,str):\n\t\tA=B[0]if B else D.pop('selector')\n\t\tif not A:I='No selector provided.';raise ValueError(I)\n\t\tfrom pyscript.web import Element as J,ElementCollection as K\n\t\tif isinstance(A,str):F=document.querySelectorAll(A)\n\t\telif isinstance(A,J):F=[A._dom_element]\n\t\telif isinstance(A,K):F=[A._dom_element for A in A]\n\t\telse:F=A if isinstance(A,list)else[A]\n\tdef H(func):\n\t\tB=func;D=inspect.signature(B)\n\t\tif D.parameters:\n\t\t\tif is_awaitable(B):\n\t\t\t\tasync def A(event):return await B(event)\n\t\t\telse:A=B\n\t\telif is_awaitable(B):\n\t\t\tasync def A(*A,**C):return await B()\n\t\telse:\n\t\t\tdef A(*A,**C):return B()\n\t\tA=wraps(B)(A)\n\t\tif isinstance(C,Event):C.add_listener(A)\n\t\telif isinstance(C,list)and all(isinstance(A,Event)for A in C):\n\t\t\tfor E in C:E.add_listener(A)\n\t\telse:\n\t\t\tfor G in F:G.addEventListener(C,create_proxy(A))\n\t\treturn A\n\treturn H(E)if E else H",
|
7
7
|
"fetch.py": "import json,js\nfrom pyscript.util import as_bytearray\nclass _Response:\n\tdef __init__(A,response):A._response=response\n\tdef __getattr__(A,attr):return getattr(A._response,attr)\n\tasync def arrayBuffer(B):\n\t\tA=await B._response.arrayBuffer()\n\t\tif hasattr(A,'to_py'):return A.to_py()\n\t\treturn memoryview(as_bytearray(A))\n\tasync def blob(A):return await A._response.blob()\n\tasync def bytearray(A):B=await A._response.arrayBuffer();return as_bytearray(B)\n\tasync def json(A):return json.loads(await A.text())\n\tasync def text(A):return await A._response.text()\nclass _DirectResponse:\n\t@staticmethod\n\tdef setup(promise,response):A=promise;A._response=_Response(response);return A._response\n\tdef __init__(B,promise):A=promise;B._promise=A;A._response=None;A.arrayBuffer=B.arrayBuffer;A.blob=B.blob;A.bytearray=B.bytearray;A.json=B.json;A.text=B.text\n\tasync def _response(A):\n\t\tif not A._promise._response:await A._promise\n\t\treturn A._promise._response\n\tasync def arrayBuffer(A):B=await A._response();return await B.arrayBuffer()\n\tasync def blob(A):B=await A._response();return await B.blob()\n\tasync def bytearray(A):B=await A._response();return await B.bytearray()\n\tasync def json(A):B=await A._response();return await B.json()\n\tasync def text(A):B=await A._response();return await B.text()\ndef fetch(url,**B):C=js.JSON.parse(json.dumps(B));D=lambda response,*B:_DirectResponse.setup(A,response);A=js.fetch(url,C).then(D);_DirectResponse(A);return A",
|
8
8
|
"ffi.py": "try:\n\timport js;from pyodide.ffi import create_proxy as _cp,to_js as _py_tjs,jsnull;from_entries=js.Object.fromEntries;is_none=lambda value:value is None or value is jsnull\n\tdef _tjs(value,**A):\n\t\tB='dict_converter'\n\t\tif not hasattr(A,B):A[B]=from_entries\n\t\treturn _py_tjs(value,**A)\nexcept:from jsffi import create_proxy as _cp;from jsffi import to_js as _tjs;import js;jsnull=js.Object.getPrototypeOf(js.Object.prototype);is_none=lambda value:value is None or value is jsnull\ncreate_proxy=_cp\nto_js=_tjs\ntry:\n\tfrom polyscript import ffi as _ffi;direct=_ffi.direct;gather=_ffi.gather;query=_ffi.query\n\tdef assign(source,*B):\n\t\tA=source\n\t\tfor C in B:_ffi.assign(A,to_js(C))\n\t\treturn A\nexcept:\n\timport js;_assign=js.Object.assign;direct=lambda source:source\n\tdef assign(source,*B):\n\t\tA=source\n\t\tfor C in B:_assign(A,to_js(C))\n\t\treturn A",
|
9
9
|
"flatted.py": "import json as _json\nclass _Known:\n\tdef __init__(A):A.key=[];A.value=[]\nclass _String:\n\tdef __init__(A,value):A.value=value\ndef _array_keys(value):\n\tA=[];B=0\n\tfor C in value:A.append(B);B+=1\n\treturn A\ndef _object_keys(value):\n\tA=[]\n\tfor B in value:A.append(B)\n\treturn A\ndef _is_array(value):return isinstance(value,(list,tuple))\ndef _is_object(value):return isinstance(value,dict)\ndef _is_string(value):return isinstance(value,str)\ndef _index(known,input,value):B=value;A=known;input.append(B);C=str(len(input)-1);A.key.append(B);A.value.append(C);return C\ndef _loop(keys,input,known,output):\n\tA=output\n\tfor B in keys:\n\t\tC=A[B]\n\t\tif isinstance(C,_String):_ref(B,input[int(C.value)],input,known,A)\n\treturn A\ndef _ref(key,value,input,known,output):\n\tB=known;A=value\n\tif _is_array(A)and A not in B:B.append(A);A=_loop(_array_keys(A),input,B,A)\n\telif _is_object(A)and A not in B:B.append(A);A=_loop(_object_keys(A),input,B,A)\n\toutput[key]=A\ndef _relate(known,input,value):\n\tB=known;A=value\n\tif _is_string(A)or _is_array(A)or _is_object(A):\n\t\ttry:return B.value[B.key.index(A)]\n\t\texcept:return _index(B,input,A)\n\treturn A\ndef _transform(known,input,value):\n\tB=known;A=value\n\tif _is_array(A):\n\t\tC=[]\n\t\tfor F in A:C.append(_relate(B,input,F))\n\t\treturn C\n\tif _is_object(A):\n\t\tD={}\n\t\tfor E in A:D[E]=_relate(B,input,A[E])\n\t\treturn D\n\treturn A\ndef _wrap(value):\n\tA=value\n\tif _is_string(A):return _String(A)\n\tif _is_array(A):\n\t\tB=0\n\t\tfor D in A:A[B]=_wrap(D);B+=1\n\telif _is_object(A):\n\t\tfor C in A:A[C]=_wrap(A[C])\n\treturn A\ndef parse(value,*C,**D):\n\tA=value;E=_json.loads(A,*C,**D);B=[]\n\tfor A in E:B.append(_wrap(A))\n\tinput=[]\n\tfor A in B:\n\t\tif isinstance(A,_String):input.append(A.value)\n\t\telse:input.append(A)\n\tA=input[0]\n\tif _is_array(A):return _loop(_array_keys(A),input,[A],A)\n\tif _is_object(A):return _loop(_object_keys(A),input,[A],A)\n\treturn A\ndef stringify(value,*D,**E):\n\tB=_Known();input=[];C=[];A=int(_index(B,input,value))\n\twhile A<len(input):C.append(_transform(B,input,input[A]));A+=1\n\treturn _json.dumps(C,*D,**E)",
|