Address review

This commit is contained in:
Simon Sawicki 2024-09-07 11:14:06 +02:00
parent 1ee96a7189
commit 2901c9b7a0
No known key found for this signature in database
2 changed files with 30 additions and 10 deletions

View File

@ -431,14 +431,10 @@ class TestTraversal:
'Morsel should not be implicitly changed to dict on usage'
def test_traversal_filter(self):
assert traverse_obj(_TEST_DATA, ['None', filter]) is None, \
data = [None, False, True, 0, 1, 0.0, 1.1, '', 'str', {}, {0: 0}, [], [1]]
assert traverse_obj(data, [..., filter]) == [True, 1, 1.1, 'str', {0: 0}, [1]], \
'`filter` should filter falsy values'
assert traverse_obj(_TEST_DATA, ['dict', filter]) is None, \
'`filter` should filter falsy values'
assert traverse_obj(_TEST_DATA, ['urls', 'index', filter]) is None, \
'`filter` should filter falsy values'
assert traverse_obj(_TEST_DATA, ['str', filter]) == 'str', \
'`filter` should leave truthy values'
def test_traversal_require(self):
with pytest.raises(ExtractorError):

View File

@ -266,7 +266,7 @@ def traverse_obj(
continue
if key is filter:
obj = filter(None, objs)
objs = filter(None, objs)
continue
if __debug__ and callable(key):
@ -368,7 +368,23 @@ def subs_list_to_dict(subs: list[dict] | None = None, /, *, ext=None):
return result
def find_element(tag=None, id=None, cls=None, attr=None, value=None, html=False):
@typing.overload
def find_element(*, attr: str, value: str, tag: str | None = None, html=False): ...
@typing.overload
def find_element(*, cls: str, html=False): ...
@typing.overload
def find_element(*, id: str, tag: str | None = None, html=False): ...
@typing.overload
def find_element(*, tag: str, html=False): ...
def find_element(*, tag=None, id=None, cls=None, attr=None, value=None, html=False):
# deliberately using `id=` and `cls=` for ease of readability
assert tag or id or cls or (attr and value), 'One of tag, id, cls or (attr AND value) is required'
if not tag:
@ -394,7 +410,15 @@ def find_element(tag=None, id=None, cls=None, attr=None, value=None, html=False)
return lambda html: get_element_text_and_html_by_tag(tag, html)[index]
def find_elements(tag=None, cls=None, attr=None, value=None, html=False):
@typing.overload
def find_elements(*, cls: str, html=False): ...
@typing.overload
def find_elements(*, attr: str, value: str, tag: str | None = None, html=False): ...
def find_elements(*, tag=None, cls=None, attr=None, value=None, html=False):
# deliberately using `cls=` for ease of readability
assert cls or (attr and value), 'One of cls or (attr AND value) is required'