8000 Cleanup pyscript web elements by fpliger · Pull Request #2094 · pyscript/pyscript · GitHub
[go: up one dir, main page]

Skip to content

Cleanup pyscript web elements #2094

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 93 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
af7092b
change pydom example to use new pyscript.web namespace
fpliger Jun 4, 2024
12f1619
change tests to use new pyscript.web namespace
fpliger Jun 4, 2024
2351d45
create new pyscript.web package and move pydom to pyscript.web.dom
fpliger Jun 4, 2024
426da5a
add __init__ to pyscript.web and expose the dom instance instead of t…
fpliger Jun 4, 2024
74c8ede
move elements from pyweb.ui to pyscript.web and temp fix pydom import
fpliger Jun 4, 2024
a9254e6
moved of elements file completed
fpliger Jun 4, 2024
5cba331
moved media from pyweb to pyscript.web
fpliger Jun 4, 2024
02cc87b
RIP pyweb
fpliger Jun 4, 2024
0fb0985
move JSProperty from pyscript.web.dom to pyscript.web.elements
fpliger Jun 4, 2024
5fd5e9b
move element classes from pyscript.web.dom to pyscript.web.elements
fpliger Jun 4, 2024
903a63f
first round of fixes while running tests
fpliger Jun 4, 2024
009aeda
fix test typo fpliger Jun 4, 2024
676a500
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 4, 2024
e4e2378
restore right type type returned for Element.parent. ALL TESTS PASS L…
fpliger Jun 5, 2024
dd44759
lint
fpliger Jun 5, 2024
56991d9
Merge branch 'pydom_pyweb_to_stdlib' of github.com:pyscript/pyscript …
fpliger Jun 5, 2024
e399663
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 5, 2024
a944199
clean up dom.py from dead commented code and osbolete comments
fpliger Jun 5, 2024
490d23b
bugfix: dom shouldn't return None when it can't find any element for …
fpliger Jun 5, 2024
27f107a
additional cleanup in tests
fpliger Jun 5, 2024
d2aa10b
lint
fpliger Jun 5, 2024
8804401
Merge branch 'pydom_pyweb_to_stdlib' of github.com:pyscript/pyscript …
fpliger Jun 5, 2024
e914b1b
initial cleaning up of unused modules
fpliger Jun 5, 2024
6824617
change element.append to not consider types anymore and add tests for…
fpliger Jun 5, 2024
11f624f
add Element.append tests for append JS elements directly and appendin…
fpliger Jun 5, 2024
edf4cdc
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 5, 2024
4784405
Tag and create the correct subclass of Element.
mchilvers Jun 7, 2024
6b4ad33
Move: Element.snap -> video.snap
mchilvers Jun 7, 2024
a599e30
Move: Element.download and draw to canvas.download and draw.
mchilvers Jun 7, 2024
c6aa88e
Minor cleanups.
mchilvers Jun 7, 2024
965fe00
Commenting.
mchilvers Jun 7, 2024
c7d13b2
Allow css classes to be passed to Element constructor.
mchilvers Jun 7, 2024
12baf1e
Commenting.
mchilvers Jun 7, 2024
17e05e4
Typo fix.
mchilvers Jun 7, 2024
a7cbe52
Make html, id and text JSProperties.
mchilvers Jun 7, 2024
d72f20b
Commenting.
mchilvers Jun 7, 2024
9f4fd2e
Remove unnecessary selected attribute on BaseElement.
mchilvers Jun 7, 2024
ca66a1a
Extract: BaseElement.from_js -> element_from_js
mchilvers Jun 7, 2024
796b038
Pass *args and **kwargs to element_from_js and remove BaseElement.create
mchilvers Jun 7, 2024
458bea9
Move value attribute to specific Element subclasses.
mchilvers Jun 7, 2024
863f64b
fix: wrapping of existing js elements.
mchilvers Jun 7, 2024
568b306
Add body and head elements so parent and children work everywhere.
mchilvers Jun 7, 2024
bc3844b
Revert order of HasOptions mixin for the select element.
mchilvers Jun 7, 2024
49af9d5
Comment out tests that are no longer relevant (see comment).
mchilvers Jun 7, 2024
66b267e
Use correct super args in mixin.
mchilvers Jun 7, 2024
f12c051
Have to use element_from_js when returning options from OptionsProxy.
mchilvers Jun 7, 2024
899ccc2
rename: StyleProxy -> Style, OptionsProxy -> Options and added Classes.
mchilvers Jun 10, 2024
3ec40dc
Remove cached_property.
mchilvers Jun 10, 2024
5635922
Remove list-y methods from Classes collection.
mchilvers Jun 11, 2024
8096e72
Allow explicit children or *args for containers.
mchilvers Jun 25, 2024
73dc1fa
controversial: fix tests to use find rather than dom
mchilvers Jun 26, 2024
e6bd691
Add html element so (say) body.parent does what is expected.
mchilvers Jun 26, 2024
b28b98a
Collapse Element class hierarchy.
mchilvers Jun 27, 2024
8000
7e218f7
rename: js_element -> dom_element
mchilvers Jun 27, 2024
ac17b48
rename: element_from_js -> element_from_dom
mchilvers Jun 27, 2024
fdb4ae1
replace: JS with DOM
mchilvers Jun 27, 2024
8483ca5
rename: _js -> _dom_element
mchilvers Jun 27, 2024
f7a67cf
fix dom tests.
mchilvers Jun 27, 2024
1e7f80d
Complete element list with void elements derived from Element.
mchilvers Jun 27, 2024
e2ea500
Added attributes to the newly added Element subclasses.
mchilvers Jun 27, 2024
5a0494d
remove dom module, replace with instance.
mchilvers Jun 27, 2024
df507e5
fix: typo in test for 'b' element.
mchilvers Jun 27, 2024
a86b07b
Merge branch 'main' into cleanup_pyscript_web_elements
mchilvers Jun 27, 2024
ed0a6de
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 27, 2024
bf7a74c
Remove dom and media modules.
mchilvers Jun 27, 2024
77b2e3a
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jun 27, 2024
2958ba5
fix up ts definitions.
mchilvers Jun 27, 2024
0776a16
Added missing import (used in content property).
mchilvers Jun 27, 2024
58d9a38
Added TODO :)
mchilvers Jun 27, 2024
141ee2e
wip: Add ClassesCollection
mchilvers Jun 30, 2024
b7a6f33
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 30, 2024
390a584
Attempt to ask black to leave class list alone.
mchilvers Jun 30, 2024
8e692fa
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jun 30, 2024
6f377cd
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jun 30, 2024
2107def
Add classes attribute to ElementCollection
mchilvers Jul 1, 2024
088f86e
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jul 1, 2024
308d070
wip: work on classes collection
mchilvers Jul 1, 2024
4c44c71
Extract code to get set of all class names in ClassesCollection.
mchilvers Jul 1, 2024
bee9824
Update elements.py
mchilvers Jul 1, 2024
f1393b3
Polishing.
mchilvers Jul 1, 2024
babb6a9
Make children return an ElementCollection
mchilvers Jul 1, 2024
fd0d94c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 1, 2024
f73bbc6
wip: Add the ability to set multiple properties.
mchilvers Jul 1, 2024
551723e
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jul 1, 2024
07b11cc
Add __getitem__ back to the dom object.
mchilvers Jul 2, 2024
81bf2fa
Put validation when setting DOM properties back in.
mchilvers Jul 2, 2024
0f324d6
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 2, 2024
8c0b73a
All tests green.
mchilvers Jul 3, 2024
89e30ff
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jul 3, 2024
4644f20
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jul 3, 2024
86d1f42
Remove unnecessary comment.
mchilvers Jul 3, 2024
f3c3a5f
Merge branch 'cleanup_pyscript_web_elements' of github.com:pyscript/p…
mchilvers Jul 3, 2024
75fd534
Merge branch 'main' into cleanup_pyscript_web_elements
fpliger Jul 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
change tests to use new pyscript.web namespace
  • Loading branch information
fpliger committed Jun 4, 2024
commit 12f161958674a5ee5dae4ce19313bd92b31ea624
101 changes: 51 additions & 50 deletions pyscript.core/test/pyscript_dom/tests/test_dom.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

import pytest
from pyscript import document, when
from pyweb import pydom
# from pyweb import pydom
from pyscript.web import dom


class TestDocument:
def test__element(self):
assert pydom._js == document
assert dom._js == document

def test_no_parent(self):
assert pydom.parent is None
assert dom.parent is None

def test_create_element(self):
new_el = pydom.create("div")
assert isinstance(new_el, pydom.BaseElement)
new_el = dom.create("div")
assert isinstance(new_el, dom.BaseElement)
assert new_el._js.tagName == "DIV"
# EXPECT the new element to be associated with the document
assert new_el.parent == None
Expand All @@ -26,14 +27,14 @@ def test_getitem_by_id():
txt = "You found test_id_selector"
selector = f"#{id_}"
# EXPECT the element to be found by id
result = pydom[selector]
result = dom[selector]
div = result[0]
# EXPECT the element text value to match what we expect and what
# the JS document.querySelector API would return
assert document.querySelector(selector).innerHTML == div.html == txt
# EXPECT the results to be of the right types
assert isinstance(div, pydom.BaseElement)
assert isinstance(result, pydom.ElementCollection)
assert isinstance(div, dom.BaseElement)
assert isinstance(result, dom.ElementCollection)


def test_getitem_by_class():
Expand All @@ -43,7 +44,7 @@ def test_getitem_by_class():
"test_selector_w_children_child_1",
]
expected_class = "a-test-class"
result = pydom[f".{expected_class}"]
result = dom[f".{expected_class}"]
div = result[0]

# EXPECT to find exact number of elements with the class in the page (== 3)
Expand All @@ -54,7 +55,7 @@ def test_getitem_by_class():


def test_read_n_write_collection_elements():
elements = pydom[".multi-elems"]
elements = dom[".multi-elems"]

for element in elements:
assert element.html == f"Content {element.id.replace('#', '')}"
Expand All @@ -69,15 +70,15 @@ class TestElement:
def test_query(self):
# GIVEN an existing element on the page, with at least 1 child element
id_ = "test_selector_w_children"
parent_div = pydom[f"#{id_}"][0]
parent_div = dom[f"#{id_}"][0]

# EXPECT it to be able to query for the first child element
div = parent_div.find("div")[0]

# EXPECT the new element to be associated with the parent
assert div.parent == parent_div
# EXPECT the new element to be a BaseElement
assert isinstance(div, pydom.BaseElement)
assert isinstance(div, dom.BaseElement)
# EXPECT the div attributes to be == to how they are configured in the page
assert div.html == "Child 1"
assert div.id == "test_selector_w_children_child_1"
Expand All @@ -86,8 +87,8 @@ def test_equality(self):
# GIVEN 2 different Elements pointing to the same underlying element
id_ = "test_id_selector"
selector = f"#{id_}"
div = pydom[selector][0]
div2 = pydom[selector][0]
div = dom[selector][0]
div2 = dom[selector][0]

# EXPECT them to be equal
assert div == div2
Expand All @@ -102,7 +103,7 @@ def test_equality(self):

def test_append_element(self):
id_ = "element-append-tests"
div = pydom[f"#{id_}"][0]
div = dom[f"#{id_}"][0]
len_children_before = len(div.children)
new_el = div.create("p")
div.append(new_el)
Expand All @@ -111,7 +112,7 @@ def test_append_element(self):

def test_append_js_element(self):
id_ = "element-append-tests"
div = pydom[f"#{id_}"][0]
div = dom[f"#{id_}"][0]
len_children_before = len(div.children)
new_el = div.create("p")
div.append(new_el._js)
Expand All @@ -120,9 +121,9 @@ def test_append_js_element(self):

def test_append_collection(self):
id_ = "element-append-tests"
div = pydom[f"#{id_}"][0]
div = dom[f"#{id_}"][0]
len_children_before = len(div.children)
collection = pydom[".collection"]
collection = dom[".collection"]
div.append(collection)
assert len(div.children) == len_children_before + len(collection)

Expand All @@ -132,40 +133,40 @@ def test_append_collection(self):
def test_read_classes(self):
id_ = "test_class_selector"
expected_class = "a-test-class"
div = pydom[f"#{id_}"][0]
div = dom[f"#{id_}"][0]
assert div.classes == [expected_class]

def test_add_remove_class(self):
id_ = "div-no-classes"
classname = "tester-class"
div = pydom[f"#{id_}"][0]
div = dom[f"#{id_}"][0]
assert not div.classes
div.add_class(classname)
same_div = pydom[f"#{id_}"][0]
same_div = dom[f"#{id_}"][0]
assert div.classes == [classname] == same_div.classes
div.remove_class(classname)
assert div.classes == [] == same_div.classes

def test_when_decorator(self):
called = False

just_a_button = pydom["#a-test-button"][0]
just_a_button = dom["#a-test-button"][0]

@when("click", just_a_button)
def on_click(event):
nonlocal called
called = True

# Now let's simulate a click on the button (using the low level JS API)
# so we don't risk pydom getting in the way
# so we don't risk dom getting in the way
assert not called
just_a_button._js.click()

assert called

def test_html_attribute(self):
# GIVEN an existing element on the page with a known empty text content
div = pydom["#element_attribute_tests"][0]
div = dom["#element_attribute_tests"][0]

# WHEN we set the html attribute
div.html = "<b>New Content</b>"
Expand All @@ -177,7 +178,7 @@ def test_html_attribute(self):

def test_text_attribute(self):
# GIVEN an existing element on the page with a known empty text content
div = pydom["#element_attribute_tests"][0]
div = dom["#element_attribute_tests"][0]

# WHEN we set the html attribute
div.text = "<b>New Content</b>"
Expand All @@ -190,12 +191,12 @@ def test_text_attribute(self):

class TestCollection:
def test_iter_eq_children(self):
elements = pydom[".multi-elems"]
elements = dom[".multi-elems"]
assert [el for el in elements] == [el for el in elements.children]
assert len(elements) == 3

def test_slices(self):
elements = pydom[".multi-elems"]
elements = dom[".multi-elems"]
assert elements[0]
_slice = elements[:2]
assert len(_slice) == 2
Expand All @@ -205,34 +206,34 @@ def test_slices(self):

def test_style_rule(self):
selector = ".multi-elems"
elements = pydom[selector]
elements = dom[selector]
for el in elements:
assert el.style["background-color"] != "red"

elements.style["background-color"] = "red"

for i, el in enumerate(pydom[selector]):
for i, el in enumerate(dom[selector]):
assert elements[i].style["background-color"] == "red"
assert el.style["background-color"] == "red"

elements.style.remove("background-color")

for i, el in enumerate(pydom[selector]):
for i, el in enumerate(dom[selector]):
assert el.style["background-color"] != "red"
assert elements[i].style["background-color"] != "red"

def test_when_decorator(self):
called = False

buttons_collection = pydom["button"]
buttons_collection = dom["button"]

@when("click", buttons_collection)
def on_click(event):
nonlocal called
called = True

# Now let's simulate a click on the button (using the low level JS API)
# so we don't risk pydom getting in the way
# so we don't risk dom getting in the way
assert not called
for button in buttons_collection:
button._js.click()
Expand All @@ -242,32 +243,32 @@ def on_click(event):

class TestCreation:
def test_create_document_element(self):
new_el = pydom.create("div")
new_el = dom.create("div")
new_el.id = "new_el_id"
assert isinstance(new_el, pydom.BaseElement)
assert isinstance(new_el, dom.BaseElement)
assert new_el._js.tagName == "DIV"
# EXPECT the new element to be associated with the document
assert new_el.parent == None
pydom.body.append(new_el)
dom.body.append(new_el)

assert pydom["#new_el_id"][0].parent == pydom.body
assert dom["#new_el_id"][0].parent == dom.body

def test_create_element_child(self):
selector = "#element-creation-test"
parent_div = pydom[selector][0]
parent_div = dom[selector][0]

# Creating an element from another element automatically creates that element
# as a child of the original element
new_el = parent_div.create(
"p", classes=["code-description"], html="Ciao PyScripters!"
)

assert isinstance(new_el, pydom.BaseElement)
assert isinstance(new_el, dom.BaseElement)
assert new_el._js.tagName == "P"
# EXPECT the new element to be associated with the document
assert new_el.parent == parent_div

assert pydom[selector][0].children[0] == new_el
assert dom[selector][0].children[0] == new_el


class TestInput:
Expand All @@ -281,7 +282,7 @@ class TestInput:
def test_value(self):
for id_ in self.input_ids:
expected_type = id_.split("_")[-1]
result = pydom[f"#{id_}"]
result = dom[f"#{id_}"]
input_el = result[0]
assert input_el._js.type == expected_type
assert input_el.value == f"Content {id_}" == input_el._js.value
Expand All @@ -299,7 +300,7 @@ def test_value(self):

def test_set_value_collection(self):
for id_ in self.input_ids:
input_el = pydom[f"#{id_}"]
input_el = dom[f"#{id_}"]

assert input_el.value[0] == f"Content {id_}" == input_el[0].value

Expand All @@ -308,35 +309,35 @@ def test_set_value_collection(self):
assert input_el.value[0] == new_value == input_el[0].value

def test_element_without_value(self):
result = pydom[f"#tests-terminal"][0]
result = dom[f"#tests-terminal"][0]
with pytest.raises(AttributeError):
result.value = "some value"

def test_element_without_collection(self):
result = pydom[f"#tests-terminal"]
result = dom[f"#tests-terminal"]
with pytest.raises(AttributeError):
result.value = "some value"

def test_element_without_collection(self):
result = pydom[f"#tests-terminal"]
result = dom[f"#tests-terminal"]
with pytest.raises(AttributeError):
result.value = "some value"


class TestSelect:
def test_select_options_iter(self):
select = pydom[f"#test_select_element_w_options"][0]
select = dom[f"#test_select_element_w_options"][0]

for i, option in enumerate(select.options, 1):
assert option.value == f"{i}"
assert option.html == f"Option {i}"

def test_select_options_len(self):
select = pydom[f"#test_select_element_w_options"][0]
select = dom[f"#test_select_element_w_options"][0]
assert len(select.options) == 2

def test_select_options_clear(self):
select = pydom[f"#test_select_element_to_clear"][0]
select = dom[f"#test_select_element_to_clear"][0]
assert len(select.options) == 3

select.options.clear()
Expand All @@ -345,7 +346,7 @@ def test_select_options_clear(self):

def test_select_element_add(self):
# GIVEN the existing select element with no options
select = pydom[f"#test_select_element"][0]
select = dom[f"#test_select_element"][0]

# EXPECT the select element to have no options
assert len(select.options) == 0
Expand Down Expand Up @@ -426,7 +427,7 @@ def test_select_element_add(self):

def test_select_options_remove(self):
# GIVEN the existing select element with 3 options
select = pydom[f"#test_select_element_to_remove"][0]
select = dom[f"#test_select_element_to_remove"][0]

# EXPECT the select element to have 3 options
assert len(select.options) == 4
Expand All @@ -448,7 +449,7 @@ def test_select_options_remove(self):

def test_select_get_selected_option(self):
# GIVEN the existing select element with one selected option
select = pydom[f"#test_select_element_w_options"][0]
select = dom[f"#test_select_element_w_options"][0]

# WHEN we get the selected option
selected_option = select.options.selected
Expand Down
5 changes: 3 additions & 2 deletions pyscript.core/tests/integration/test_pyweb.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,9 @@ def parse_value(v):
code_ = f"""
from pyscript import when
<script type="{interpreter}">
from pyweb import pydom
from pyweb.ui.elements import {el_type}
from pyscript.web import dom
from pyscript.web.elements import {el_type}

el = {el_type}({attributes})
pydom.body.append(el)
</script>
Expand Down
0