PyDom compatibility with MicroPython (#1954)

* fix pydom example

* fix the pydom test example to use a python syntax that works with MicroPython by replacing datetime

* add note about capturing errors importing when

* patch event_handler to handle compat with micropython

* turn pyweb into a package and remove hack to make pydom a sort of module with an ugly hack

* add pydom example using micropython

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* fix select element test

* change pydom test page to let pytest tests load it properly

* add missing folders to test dev server so it can run examples in the manual tests folder

* add pydom tests to the test suite as integration tests

* lint

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* improve fixes in event_handling

* change when decorator to actually dynamically fail in micropython and support handlers with or without arguments

* simplify when decorator code

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* add type declaration back for the MP use case

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* removed code to access pydom get index as I can't think of any proper use case

* remove old commented hack to replace pydom module with class

* fix examples title

* precommit checks

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Fabio Pliger
2024-01-30 14:30:16 -05:00
committed by GitHub
parent 3ff0f84391
commit bcaab0eb93
12 changed files with 149 additions and 36 deletions

View File

@@ -1,9 +1,34 @@
import sys
import warnings
from functools import cached_property
from typing import Any
try:
from typing import Any
except ImportError:
Any = "Any"
try:
import warnings
except ImportError:
# TODO: For now it probably means we are in MicroPython. We should figure
# out the "right" way to handle this. For now we just ignore the warning
# and logging to console
class warnings:
@staticmethod
def warn(*args, **kwargs):
print("WARNING: ", *args, **kwargs)
try:
from functools import cached_property
except ImportError:
# TODO: same comment about micropython as above
cached_property = property
try:
from pyodide.ffi import JsProxy
except ImportError:
# TODO: same comment about micropython as above
def JsProxy(obj):
return obj
from pyodide.ffi import JsProxy
from pyscript import display, document, window
alert = window.alert
@@ -361,7 +386,7 @@ class OptionsProxy:
return self.options[key]
class StyleProxy(dict):
class StyleProxy: # (dict):
def __init__(self, element: Element) -> None:
self._element = element
@@ -480,7 +505,7 @@ class ElementCollection:
class DomScope:
def __getattr__(self, __name: str) -> Any:
def __getattr__(self, __name: str):
element = document[f"#{__name}"]
if element:
return element[0]
@@ -494,7 +519,12 @@ class PyDom(BaseElement):
ElementCollection = ElementCollection
def __init__(self):
super().__init__(document)
# PyDom is a special case of BaseElement where we don't want to create a new JS element
# and it really doesn't have a need for styleproxy or parent to to call to __init__
# (which actually fails in MP for some reason)
self._js = document
self._parent = None
self._proxies = {}
self.ids = DomScope()
self.body = Element(document.body)
self.head = Element(document.head)
@@ -503,10 +533,6 @@ class PyDom(BaseElement):
return super().create(type_, is_child=False, classes=classes, html=html)
def __getitem__(self, key):
if isinstance(key, int):
indices = range(*key.indices(len(self.list)))
return [self.list[i] for i in indices]
elements = self._js.querySelectorAll(key)
if not elements:
return None
@@ -514,5 +540,3 @@ class PyDom(BaseElement):
dom = PyDom()
sys.modules[__name__] = dom