Skip to content

[Markdown] Add missing stubs #14285

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions stubs/Markdown/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# Deprecated types are infered as functions:
markdown.extensions.abbr.AbbrPreprocessor
markdown.extensions.abbr.AbbrInlineProcessor
markdown.postprocessors.UnescapePostprocessor
4 changes: 0 additions & 4 deletions stubs/Markdown/METADATA.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
version = "3.8.*"
upstream_repository = "https://github.com/Python-Markdown/markdown"
partial_stub = true

[tool.stubtest]
ignore_missing_stub = true
10 changes: 10 additions & 0 deletions stubs/Markdown/markdown/__main__.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import optparse
from logging import Logger
from typing import Any

logger: Logger

def parse_options(
args: list[str] | None = None, values: optparse.Values | None = None
) -> tuple[dict[str, Any], Any]: ... # first item is opts dict, second item is Values.verbose field
def run() -> None: ...
5 changes: 5 additions & 0 deletions stubs/Markdown/markdown/core.pyi
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from codecs import _ReadableStream, _WritableStream
from collections.abc import Callable, Mapping, Sequence
from logging import Logger
from typing import Any, ClassVar, Literal
from typing_extensions import Self
from xml.etree.ElementTree import Element
Expand All @@ -8,6 +9,10 @@ from . import blockparser, inlinepatterns, postprocessors, preprocessors, treepr
from .extensions import Extension
from .util import HtmlStash, Registry

__all__ = ["Markdown", "markdown", "markdownFromFile"]

logger: Logger

class Markdown:
preprocessors: Registry[preprocessors.Preprocessor]
inlinePatterns: Registry[inlinepatterns.Pattern]
Expand Down
1 change: 1 addition & 0 deletions stubs/Markdown/markdown/extensions/abbr.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class AbbrTreeprocessor(Treeprocessor):
RE: Pattern[str] | None
abbrs: dict[str, str]
def __init__(self, md: Markdown | None = None, abbrs: dict[str, str] | None = None) -> None: ...
def create_element(self, title: str, text: str, tail: str) -> Element: ...
def iter_element(self, el: Element, parent: Element | None = None) -> None: ...

# Techinically it is the same type as `AbbrPreprocessor` just not deprecated.
Expand Down
28 changes: 27 additions & 1 deletion stubs/Markdown/markdown/extensions/md_in_html.pyi
Original file line number Diff line number Diff line change
@@ -1,8 +1,34 @@
from xml.etree.ElementTree import Element
from collections.abc import Iterable, Mapping
from typing import Literal
from xml.etree.ElementTree import Element, TreeBuilder

from markdown.blockprocessors import BlockProcessor
from markdown.extensions import Extension
from markdown.htmlparser import HTMLExtractor
from markdown.postprocessors import RawHtmlPostprocessor
from markdown.preprocessors import Preprocessor

class HTMLExtractorExtra(HTMLExtractor):
block_level_tags: set[str]
span_tags: set[str]
raw_tags: set[str]
block_tags: set[str]
span_and_blocks_tags: set[str]
mdstack: list[str]
treebuilder: TreeBuilder
mdstate: list[Literal["block", "span", "off"] | None]
mdstarted: list[bool]
def get_element(self) -> Element: ...
def get_state(self, tag: str, attrs: Mapping[str, str]) -> Literal["block", "span", "off"] | None: ...
def handle_starttag(self, tag: str, attrs: Iterable[tuple[str, str | None]]) -> None: ...
def handle_endtag(self, tag: str) -> None: ...
def handle_startendtag(self, tag: str, attrs: Iterable[tuple[str, str | None]]) -> None: ...
def handle_data(self, data: str) -> None: ...
def handle_empty_tag(self, data: str, is_block: bool) -> None: ...
def parse_pi(self, i: int) -> int: ...
def parse_html_declaration(self, i: int) -> int: ...

class HtmlBlockPreprocessor(Preprocessor): ...

class MarkdownInHtmlProcessor(BlockProcessor):
def parse_element_content(self, element: Element) -> None: ...
Expand Down
2 changes: 2 additions & 0 deletions stubs/Markdown/markdown/extensions/meta.pyi
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from logging import Logger
from re import Pattern

from markdown.core import Markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor

log: Logger
META_RE: Pattern[str]
META_MORE_RE: Pattern[str]
BEGIN_RE: Pattern[str]
Expand Down
2 changes: 2 additions & 0 deletions stubs/Markdown/markdown/extensions/smarty.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ singleQuoteStartRe: str
doubleQuoteStartRe: str
doubleQuoteSetsRe: str
singleQuoteSetsRe: str
doubleQuoteSetsRe2: str
singleQuoteSetsRe2: str
decadeAbbrRe: str
openingDoubleQuotesRegex: str
closingDoubleQuotesRegex: str
Expand Down
28 changes: 28 additions & 0 deletions stubs/Markdown/markdown/htmlparser.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import html.parser as htmlparser
import re
from _frozen_importlib import ModuleSpec
from collections.abc import Sequence

from markdown import Markdown

spec: ModuleSpec
blank_line_re: re.Pattern[str]

class HTMLExtractor(htmlparser.HTMLParser):
empty_tags: set[str]
lineno_start_cache: list[int]
md: Markdown
def __init__(self, md: Markdown, *args, **kwargs): ...
inraw: bool
intail: bool
stack: list[str]
cleandoc: list[str]
@property
def line_offset(self) -> int: ...
def at_line_start(self) -> bool: ...
def get_endtag_text(self, tag: str) -> str: ...
def handle_starttag(self, tag: str, attrs: Sequence[tuple[str, str]]) -> None: ... # type: ignore[override]
def handle_empty_tag(self, data: str, is_block: bool) -> None: ...
def handle_decl(self, data: str) -> None: ...
def parse_bogus_comment(self, i: int, report: int = 0) -> int: ...
def get_starttag_text(self) -> str: ...
13 changes: 13 additions & 0 deletions stubs/Markdown/markdown/postprocessors.pyi
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import re
from typing import ClassVar
from typing_extensions import deprecated

from markdown.core import Markdown

from . import util
Expand All @@ -8,7 +12,16 @@ class Postprocessor(util.Processor):
def run(self, text: str) -> str: ...

class RawHtmlPostprocessor(Postprocessor):
BLOCK_LEVEL_REGEX: ClassVar[re.Pattern[str]]
def isblocklevel(self, html: str) -> bool: ...
def stash_to_string(self, text: str) -> str: ...

class AndSubstitutePostprocessor(Postprocessor): ...

@deprecated(
"This class is deprecated and will be removed in the future; "
"use [`UnescapeTreeprocessor`][markdown.treeprocessors.UnescapeTreeprocessor] instead."
)
class UnescapePostprocessor(Postprocessor):
RE: ClassVar[re.Pattern[str]]
def unescape(self, m: re.Match[str]) -> str: ...
5 changes: 5 additions & 0 deletions stubs/Markdown/markdown/serializers.pyi
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import re
from xml.etree.ElementTree import Element

__all__ = ["to_html_string", "to_xhtml_string"]

RE_AMP: re.Pattern[str]

def to_html_string(element: Element) -> str: ...
def to_xhtml_string(element: Element) -> str: ...
30 changes: 30 additions & 0 deletions stubs/Markdown/markdown/test_tools.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import unittest
from _typeshed import Unused
from typing import Any

__all__ = ["TestCase", "LegacyTestCase", "Kwargs"]

class TestCase(unittest.TestCase):
default_kwargs: dict[str, Any] # taken from source code
def assertMarkdownRenders(
self,
source: str,
expected: str,
expected_attrs: dict[str, Any] | None = None, # values passing to self.assertEqual()
**kwargs,
) -> None: ...
def dedent(self, text: str) -> str: ...

class recursionlimit:
limit: int
old_limit: int
def __init__(self, limit: int) -> None: ...
def __enter__(self) -> None: ...
def __exit__(self, type: Unused, value: Unused, tb: Unused) -> None: ...

class Kwargs(dict[str, Any]): ...

class LegacyTestMeta(type):
def __new__(cls, name: str, bases: tuple[type, ...], dct: dict[str, Any]): ... # dct is namespace argument for type.__new__()

class LegacyTestCase(unittest.TestCase, metaclass=LegacyTestMeta): ...