diff --git a/CHANGES.md b/CHANGES.md index 391ed2c..78b5f4f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,7 +8,7 @@ * Change backport rarfile_py2; Fixes for multivolume RAR3 with encrypted headers * Update Apprise 0.8.0 (6aa52c3) to 0.8.4 (1ce7cbb) * Update attr 19.2.0.dev0 (daf2bc8) to 20.1.0.dev0 (4bd6827) -* Update Beautiful Soup 4.8.1 (r540) to 4.8.2 (r554) +* Update Beautiful Soup 4.8.1 (r540) to 4.8.2 (r556) * Update Certifi 2019.06.16 (84dc766) to 2019.11.28 (21abb9b) * Update dateutil 2.8.1 (fc9b162) to 2.8.1 (110a09b) * Update DiskCache library 4.0.0 (2c79bb9) to 4.1.0 (b0451e0) @@ -38,6 +38,7 @@ * Change remove deprecated `buildNameCache` * Update Apprise 0.8.0 (6aa52c3) to 0.8.3 (4aee9de) * Update attr 19.2.0.dev0 (daf2bc8) to 20.1.0.dev0 (9b5e988) +* Update Beautiful Soup 4.8.1 (r540) to 4.8.2 (r554) * Update Requests library 2.22.0 (3d968ff) to 2.22.0 (d2f65af) * Update Tornado_py3 Web Server 6.0.3 (ff985fe) to 6.1.dev1 (18b653c) * Update urllib3 release 1.25.6 (4a6c288) to 1.25.7 (37ba61a) diff --git a/lib/bs4/__init__.pyi b/lib/bs4/__init__.pyi index 5edd57c..fa304bd 100644 --- a/lib/bs4/__init__.pyi +++ b/lib/bs4/__init__.pyi @@ -57,7 +57,7 @@ class FeatureNotFound(ValueError): ... # # NOTE: This dynamically typed stub was automatically generated by stubgen. -from .formatter import Formatter, HTMLFormatter, XMLFormatter +from .formatter import Formatter as Formatter, HTMLFormatter as HTMLFormatter, XMLFormatter as XMLFormatter from typing import Any, Optional __license__: str @@ -101,7 +101,7 @@ class PageElement: replace_with_children: Any = ... replaceWithChildren: Any = ... def wrap(self, wrap_inside: Any): ... - def extract(self): ... + def extract(self, _self_index: Optional[Any] = ...): ... def _last_descendant(self, is_initialized: bool = ..., accept_self: bool = ...): ... _lastRecursiveChild: Any = ... def insert(self, position: Any, new_child: Any) -> None: ... @@ -149,6 +149,8 @@ class PageElement: def previous_siblings(self) -> None: ... @property def parents(self) -> None: ... + @property + def decomposed(self): ... def nextGenerator(self): ... def nextSiblingGenerator(self): ... def previousGenerator(self): ... @@ -170,6 +172,8 @@ class NavigableString(str, PageElement): def name(self, name: Any) -> None: ... class PreformattedString(NavigableString): + PREFIX: str = ... + SUFFIX: str = ... def output_ready(self, formatter: Optional[Any] = ...): ... class CData(PreformattedString): @@ -236,9 +240,9 @@ class Tag(PageElement): def get(self, key: Any, default: Optional[Any] = ...): ... def get_attribute_list(self, key: Any, default: Optional[Any] = ...): ... def has_attr(self, key: Any): ... - def __hash__(self): ... + def __hash__(self) -> Any: ... def __getitem__(self, key: Any): ... - def __iter__(self): ... + def __iter__(self) -> Any: ... def __len__(self): ... def __contains__(self, x: Any): ... def __bool__(self): ... @@ -246,8 +250,8 @@ class Tag(PageElement): def __delitem__(self, key: Any) -> None: ... def __call__(self, *args: Any, **kwargs: Any): ... def __getattr__(self, tag: Any): ... - def __eq__(self, other: Any): ... - def __ne__(self, other: Any): ... + def __eq__(self, other: Any) -> Any: ... + def __ne__(self, other: Any) -> Any: ... def __repr__(self, encoding: str = ...): ... def __unicode__(self): ... def __str__(self): ... diff --git a/lib/bs4/builder/__init__.pyi b/lib/bs4/builder/__init__.pyi new file mode 100644 index 0000000..8a33764 --- /dev/null +++ b/lib/bs4/builder/__init__.pyi @@ -0,0 +1,62 @@ +from typing import Any, Optional + +class TreeBuilderRegistry: + builders_for_feature: Any = ... + builders: Any = ... + def __init__(self) -> None: ... + def register(self, treebuilder_class: Any) -> None: ... + def lookup(self, *features: Any): ... + +class TreeBuilder: + NAME: str = ... + ALTERNATE_NAMES: Any = ... + features: Any = ... + is_xml: bool = ... + picklable: bool = ... + empty_element_tags: Any = ... + DEFAULT_CDATA_LIST_ATTRIBUTES: Any = ... + DEFAULT_PRESERVE_WHITESPACE_TAGS: Any = ... + USE_DEFAULT: Any = ... + TRACKS_LINE_NUMBERS: bool = ... + soup: Any = ... + cdata_list_attributes: Any = ... + preserve_whitespace_tags: Any = ... + store_line_numbers: Any = ... + def __init__(self, multi_valued_attributes: Any = ..., preserve_whitespace_tags: Any = ..., store_line_numbers: Any = ...) -> None: ... + def initialize_soup(self, soup: Any) -> None: ... + def reset(self) -> None: ... + def can_be_empty_element(self, tag_name: Any): ... + def feed(self, markup: Any) -> None: ... + def prepare_markup(self, markup: Any, user_specified_encoding: Optional[Any] = ..., document_declared_encoding: Optional[Any] = ..., exclude_encodings: Optional[Any] = ...) -> None: ... + def test_fragment_to_document(self, fragment: Any): ... + def set_up_substitutions(self, tag: Any): ... + def _replace_cdata_list_attribute_values(self, tag_name: Any, attrs: Any): ... + +class SAXTreeBuilder(TreeBuilder): + def feed(self, markup: Any) -> None: ... + def close(self) -> None: ... + def startElement(self, name: Any, attrs: Any) -> None: ... + def endElement(self, name: Any) -> None: ... + def startElementNS(self, nsTuple: Any, nodeName: Any, attrs: Any) -> None: ... + def endElementNS(self, nsTuple: Any, nodeName: Any) -> None: ... + def startPrefixMapping(self, prefix: Any, nodeValue: Any) -> None: ... + def endPrefixMapping(self, prefix: Any) -> None: ... + def characters(self, content: Any) -> None: ... + def startDocument(self) -> None: ... + def endDocument(self) -> None: ... + +class HTMLTreeBuilder(TreeBuilder): + empty_element_tags: Any = ... + block_elements: Any = ... + DEFAULT_CDATA_LIST_ATTRIBUTES: Any = ... + DEFAULT_PRESERVE_WHITESPACE_TAGS: Any = ... + def set_up_substitutions(self, tag: Any): ... + +class ParserRejectedMarkup(Exception): + def __init__(self, message_or_exception: Any) -> None: ... + +# Names in __all__ with no definition: +# HTML5TreeBuilder +# HTMLParserTreeBuilder +# LXMLTreeBuilder +# LXMLTreeBuilderForXML diff --git a/lib/bs4/builder/_html5lib.pyi b/lib/bs4/builder/_html5lib.pyi new file mode 100644 index 0000000..44808cd --- /dev/null +++ b/lib/bs4/builder/_html5lib.pyi @@ -0,0 +1,65 @@ +from ..builder import HTMLTreeBuilder +from html5lib.treebuilders import base as treebuilder_base +from typing import Any, Optional + +class HTML5TreeBuilder(HTMLTreeBuilder): + NAME: str = ... + features: Any = ... + TRACKS_LINE_NUMBERS: bool = ... + user_specified_encoding: Any = ... + def prepare_markup(self, markup: Any, user_specified_encoding: Any, document_declared_encoding: Optional[Any] = ..., exclude_encodings: Optional[Any] = ...) -> None: ... + def feed(self, markup: Any) -> None: ... + underlying_builder: Any = ... + def create_treebuilder(self, namespaceHTMLElements: Any): ... + def test_fragment_to_document(self, fragment: Any): ... + +class TreeBuilderForHtml5lib(treebuilder_base.TreeBuilder): + soup: Any = ... + parser: Any = ... + store_line_numbers: Any = ... + def __init__(self, namespaceHTMLElements: Any, soup: Optional[Any] = ..., store_line_numbers: bool = ..., **kwargs: Any) -> None: ... + def documentClass(self): ... + def insertDoctype(self, token: Any) -> None: ... + def elementClass(self, name: Any, namespace: Any): ... + def commentClass(self, data: Any): ... + def fragmentClass(self): ... + def appendChild(self, node: Any) -> None: ... + def getDocument(self): ... + def getFragment(self): ... + def testSerializer(self, element: Any): ... + +class AttrList: + element: Any = ... + attrs: Any = ... + def __init__(self, element: Any) -> None: ... + def __iter__(self) -> Any: ... + def __setitem__(self, name: Any, value: Any) -> None: ... + def items(self): ... + def keys(self): ... + def __len__(self): ... + def __getitem__(self, name: Any): ... + def __contains__(self, name: Any): ... + +class Element(treebuilder_base.Node): + element: Any = ... + soup: Any = ... + namespace: Any = ... + def __init__(self, element: Any, soup: Any, namespace: Any) -> None: ... + def appendChild(self, node: Any) -> None: ... + def getAttributes(self): ... + def setAttributes(self, attributes: Any) -> None: ... + attributes: Any = ... + def insertText(self, data: Any, insertBefore: Optional[Any] = ...) -> None: ... + def insertBefore(self, node: Any, refNode: Any) -> None: ... + def removeChild(self, node: Any) -> None: ... + def reparentChildren(self, new_parent: Any) -> None: ... + def cloneNode(self): ... + def hasContent(self): ... + def getNameTuple(self): ... + nameTuple: Any = ... + +class TextNode(Element): + element: Any = ... + soup: Any = ... + def __init__(self, element: Any, soup: Any) -> None: ... + def cloneNode(self) -> None: ... diff --git a/lib/bs4/builder/_htmlparser.pyi b/lib/bs4/builder/_htmlparser.pyi new file mode 100644 index 0000000..aa9cc6c --- /dev/null +++ b/lib/bs4/builder/_htmlparser.pyi @@ -0,0 +1,31 @@ +from ..builder import HTMLTreeBuilder +from html.parser import HTMLParser +from typing import Any, Optional + +class HTMLParseError(Exception): ... + +class BeautifulSoupHTMLParser(HTMLParser): + already_closed_empty_element: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def error(self, msg: Any) -> None: ... + def handle_startendtag(self, name: Any, attrs: Any) -> None: ... + def handle_starttag(self, name: Any, attrs: Any, handle_empty_element: bool = ...) -> None: ... + def handle_endtag(self, name: Any, check_already_closed: bool = ...) -> None: ... + def handle_data(self, data: Any) -> None: ... + def handle_charref(self, name: Any) -> None: ... + def handle_entityref(self, name: Any) -> None: ... + def handle_comment(self, data: Any) -> None: ... + def handle_decl(self, data: Any) -> None: ... + def unknown_decl(self, data: Any) -> None: ... + def handle_pi(self, data: Any) -> None: ... + +class HTMLParserTreeBuilder(HTMLTreeBuilder): + is_xml: bool = ... + picklable: bool = ... + NAME: Any = ... + features: Any = ... + TRACKS_LINE_NUMBERS: bool = ... + parser_args: Any = ... + def __init__(self, parser_args: Optional[Any] = ..., parser_kwargs: Optional[Any] = ..., **kwargs: Any) -> None: ... + def prepare_markup(self, markup: Any, user_specified_encoding: Optional[Any] = ..., document_declared_encoding: Optional[Any] = ..., exclude_encodings: Optional[Any] = ...) -> None: ... + def feed(self, markup: Any) -> None: ... diff --git a/lib/bs4/builder/_lxml.pyi b/lib/bs4/builder/_lxml.pyi new file mode 100644 index 0000000..4cc4a52 --- /dev/null +++ b/lib/bs4/builder/_lxml.pyi @@ -0,0 +1,46 @@ +from ..builder import HTMLTreeBuilder, TreeBuilder +from typing import Any, Optional + +class LXMLTreeBuilderForXML(TreeBuilder): + DEFAULT_PARSER_CLASS: Any = ... + is_xml: bool = ... + processing_instruction_class: Any = ... + NAME: str = ... + ALTERNATE_NAMES: Any = ... + features: Any = ... + CHUNK_SIZE: int = ... + DEFAULT_NSMAPS: Any = ... + DEFAULT_NSMAPS_INVERTED: Any = ... + def initialize_soup(self, soup: Any) -> None: ... + def _register_namespaces(self, mapping: Any) -> None: ... + def default_parser(self, encoding: Any): ... + def parser_for(self, encoding: Any): ... + _default_parser: Any = ... + empty_element_tags: Any = ... + soup: Any = ... + nsmaps: Any = ... + def __init__(self, parser: Optional[Any] = ..., empty_element_tags: Optional[Any] = ..., **kwargs: Any) -> None: ... + def _getNsTag(self, tag: Any): ... + def prepare_markup(self, markup: Any, user_specified_encoding: Optional[Any] = ..., exclude_encodings: Optional[Any] = ..., document_declared_encoding: Optional[Any] = ...) -> None: ... + parser: Any = ... + def feed(self, markup: Any) -> None: ... + def close(self) -> None: ... + def start(self, name: Any, attrs: Any, nsmap: Any = ...) -> None: ... + def _prefix_for_namespace(self, namespace: Any): ... + def end(self, name: Any) -> None: ... + def pi(self, target: Any, data: Any) -> None: ... + def data(self, content: Any) -> None: ... + def doctype(self, name: Any, pubid: Any, system: Any) -> None: ... + def comment(self, content: Any) -> None: ... + def test_fragment_to_document(self, fragment: Any): ... + +class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML): + NAME: Any = ... + ALTERNATE_NAMES: Any = ... + features: Any = ... + is_xml: bool = ... + processing_instruction_class: Any = ... + def default_parser(self, encoding: Any): ... + parser: Any = ... + def feed(self, markup: Any) -> None: ... + def test_fragment_to_document(self, fragment: Any): ... diff --git a/lib/bs4/check_block.pyi b/lib/bs4/check_block.pyi index 9454b5f..fc54239 100644 --- a/lib/bs4/check_block.pyi +++ b/lib/bs4/check_block.pyi @@ -2,6 +2,7 @@ # # NOTE: This dynamically typed stub was automatically generated by stubgen. +from . import _s as _s from typing import Any data: Any diff --git a/lib/bs4/diagnose.pyi b/lib/bs4/diagnose.pyi index e560603..cca31b2 100644 --- a/lib/bs4/diagnose.pyi +++ b/lib/bs4/diagnose.pyi @@ -2,7 +2,8 @@ # # NOTE: This dynamically typed stub was automatically generated by stubgen. -from .builder import builder_registry +from . import BeautifulSoup as BeautifulSoup, __version__ as __version__ +from .builder import builder_registry as builder_registry from html.parser import HTMLParser from typing import Any diff --git a/lib/bs4/element.pyi b/lib/bs4/element.pyi index aa7b827..cadf4ae 100644 --- a/lib/bs4/element.pyi +++ b/lib/bs4/element.pyi @@ -2,7 +2,7 @@ # # NOTE: This dynamically typed stub was automatically generated by stubgen. -from .formatter import Formatter, HTMLFormatter, XMLFormatter +from .formatter import Formatter as Formatter, HTMLFormatter as HTMLFormatter, XMLFormatter as XMLFormatter from typing import Any, Optional __license__: str @@ -46,7 +46,7 @@ class PageElement: replace_with_children: Any = ... replaceWithChildren: Any = ... def wrap(self, wrap_inside: Any): ... - def extract(self): ... + def extract(self, _self_index: Optional[Any] = ...): ... def _last_descendant(self, is_initialized: bool = ..., accept_self: bool = ...): ... _lastRecursiveChild: Any = ... def insert(self, position: Any, new_child: Any) -> None: ... @@ -94,6 +94,8 @@ class PageElement: def previous_siblings(self) -> None: ... @property def parents(self) -> None: ... + @property + def decomposed(self): ... def nextGenerator(self): ... def nextSiblingGenerator(self): ... def previousGenerator(self): ... @@ -115,6 +117,8 @@ class NavigableString(str, PageElement): def name(self, name: Any) -> None: ... class PreformattedString(NavigableString): + PREFIX: str = ... + SUFFIX: str = ... def output_ready(self, formatter: Optional[Any] = ...): ... class CData(PreformattedString): @@ -181,9 +185,9 @@ class Tag(PageElement): def get(self, key: Any, default: Optional[Any] = ...): ... def get_attribute_list(self, key: Any, default: Optional[Any] = ...): ... def has_attr(self, key: Any): ... - def __hash__(self): ... + def __hash__(self) -> Any: ... def __getitem__(self, key: Any): ... - def __iter__(self): ... + def __iter__(self) -> Any: ... def __len__(self): ... def __contains__(self, x: Any): ... def __bool__(self): ... @@ -191,8 +195,8 @@ class Tag(PageElement): def __delitem__(self, key: Any) -> None: ... def __call__(self, *args: Any, **kwargs: Any): ... def __getattr__(self, tag: Any): ... - def __eq__(self, other: Any): ... - def __ne__(self, other: Any): ... + def __eq__(self, other: Any) -> Any: ... + def __ne__(self, other: Any) -> Any: ... def __repr__(self, encoding: str = ...): ... def __unicode__(self): ... def __str__(self): ... diff --git a/lib/bs4/formatter.pyi b/lib/bs4/formatter.pyi index 1103cc7..2595e54 100644 --- a/lib/bs4/formatter.pyi +++ b/lib/bs4/formatter.pyi @@ -2,7 +2,7 @@ # # NOTE: This dynamically typed stub was automatically generated by stubgen. -from .dammit import EntitySubstitution +from .dammit import EntitySubstitution as EntitySubstitution from typing import Any, Optional class Formatter(EntitySubstitution): diff --git a/lib/bs4_py2/element.py b/lib/bs4_py2/element.py index 4c17ff6..8a0280f 100644 --- a/lib/bs4_py2/element.py +++ b/lib/bs4_py2/element.py @@ -239,7 +239,7 @@ class PageElement(object): raise ValueError("Cannot replace a Tag with its parent.") old_parent = self.parent my_index = self.parent.index(self) - self.extract() + self.extract(_self_index=my_index) old_parent.insert(my_index, replace_with) return self replaceWith = replace_with # BS3 @@ -255,7 +255,7 @@ class PageElement(object): "Cannot replace an element with its contents when that" "element is not part of a tree.") my_index = self.parent.index(self) - self.extract() + self.extract(_self_index=my_index) for child in reversed(self.contents[:]): my_parent.insert(my_index, child) return self @@ -273,13 +273,19 @@ class PageElement(object): wrap_inside.append(me) return wrap_inside - def extract(self): + def extract(self, _self_index=None): """Destructively rips this element out of the tree. + :param _self_index: The location of this element in its parent's + .contents, if known. Passing this in allows for a performance + optimization. + :return: `self`, no longer part of the tree. """ if self.parent is not None: - del self.parent.contents[self.parent.index(self)] + if _self_index is None: + _self_index = self.parent.index(self) + del self.parent.contents[_self_index] #Find the two elements that would be next to each other if #this element (and any children) hadn't been parsed. Connect diff --git a/lib/bs4_py3/element.py b/lib/bs4_py3/element.py index 3100fc0..aa084ff 100644 --- a/lib/bs4_py3/element.py +++ b/lib/bs4_py3/element.py @@ -239,7 +239,7 @@ class PageElement(object): raise ValueError("Cannot replace a Tag with its parent.") old_parent = self.parent my_index = self.parent.index(self) - self.extract() + self.extract(_self_index=my_index) old_parent.insert(my_index, replace_with) return self replaceWith = replace_with # BS3 @@ -255,7 +255,7 @@ class PageElement(object): "Cannot replace an element with its contents when that" "element is not part of a tree.") my_index = self.parent.index(self) - self.extract() + self.extract(_self_index=my_index) for child in reversed(self.contents[:]): my_parent.insert(my_index, child) return self @@ -273,13 +273,19 @@ class PageElement(object): wrap_inside.append(me) return wrap_inside - def extract(self): + def extract(self, _self_index=None): """Destructively rips this element out of the tree. + :param _self_index: The location of this element in its parent's + .contents, if known. Passing this in allows for a performance + optimization. + :return: `self`, no longer part of the tree. """ if self.parent is not None: - del self.parent.contents[self.parent.index(self)] + if _self_index is None: + _self_index = self.parent.index(self) + del self.parent.contents[_self_index] #Find the two elements that would be next to each other if #this element (and any children) hadn't been parsed. Connect