Skip to content

Commit 32097fb

Browse files
authored
⬆️ UPGRADE: Drop support for EOL Python 3.6 (#194)
1 parent bf8ca33 commit 32097fb

File tree

24 files changed

+171
-178
lines changed

24 files changed

+171
-178
lines changed

.github/workflows/tests.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
runs-on: ubuntu-latest
3232
strategy:
3333
matrix:
34-
python-version: ['pypy-3.6', '3.6', '3.7', '3.8', '3.9', '3.10']
34+
python-version: ['pypy-3.7', '3.7', '3.8', '3.9', '3.10']
3535

3636
steps:
3737
- uses: actions/checkout@v2
@@ -126,3 +126,11 @@ jobs:
126126
with:
127127
user: __token__
128128
password: ${{ secrets.PYPI_KEY }}
129+
130+
allgood:
131+
runs-on: ubuntu-latest
132+
needs:
133+
- pre-commit
134+
- tests
135+
steps:
136+
- run: echo "Great success!"

markdown_it/cli/parse.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
55
Parse one or more markdown files, convert each to HTML, and print to stdout.
66
"""
7+
from __future__ import annotations
8+
79
import argparse
10+
from collections.abc import Iterable, Sequence
811
import sys
9-
from typing import Iterable, Optional, Sequence
1012

1113
from markdown_it import __version__
1214
from markdown_it.main import MarkdownIt
@@ -15,7 +17,7 @@
1517
version_str = "markdown-it-py [version {}]".format(__version__)
1618

1719

18-
def main(args: Optional[Sequence[str]] = None) -> int:
20+
def main(args: Sequence[str] | None = None) -> int:
1921
namespace = parse_args(args)
2022
if namespace.filenames:
2123
convert(namespace.filenames)
@@ -63,7 +65,7 @@ def interactive() -> None:
6365
break
6466

6567

66-
def parse_args(args: Optional[Sequence[str]]) -> argparse.Namespace:
68+
def parse_args(args: Sequence[str] | None) -> argparse.Namespace:
6769
"""Parse input CLI arguments."""
6870
parser = argparse.ArgumentParser(
6971
description="Parse one or more markdown files, "

markdown_it/common/normalize_url.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from __future__ import annotations
2+
3+
from collections.abc import Callable
14
import re
2-
from typing import Callable, Optional
35
from urllib.parse import urlparse, urlunparse, quote, unquote # noqa: F401
46

57
import mdurl
@@ -67,7 +69,7 @@ def normalizeLinkText(url: str) -> str:
6769
GOOD_DATA_RE = re.compile(r"^data:image\/(gif|png|jpeg|webp);")
6870

6971

70-
def validateLink(url: str, validator: Optional[Callable] = None) -> bool:
72+
def validateLink(url: str, validator: Callable | None = None) -> bool:
7173
"""Validate URL link is allowed in output.
7274
7375
This validator can prohibit more than really needed to prevent XSS.

markdown_it/main.py

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1+
from __future__ import annotations
2+
13
from contextlib import contextmanager
2-
from typing import (
3-
Any,
4-
Callable,
5-
Dict,
6-
Generator,
7-
Iterable,
8-
List,
9-
Mapping,
10-
MutableMapping,
11-
Optional,
12-
Union,
13-
)
4+
from collections.abc import Callable, Generator, Iterable, Mapping, MutableMapping
5+
from typing import Any
146

157
from . import helpers, presets # noqa F401
168
from .common import normalize_url, utils # noqa F401
@@ -40,10 +32,10 @@
4032
class MarkdownIt:
4133
def __init__(
4234
self,
43-
config: Union[str, Mapping] = "commonmark",
44-
options_update: Optional[Mapping] = None,
35+
config: str | Mapping = "commonmark",
36+
options_update: Mapping | None = None,
4537
*,
46-
renderer_cls: Callable[["MarkdownIt"], RendererProtocol] = RendererHTML,
38+
renderer_cls: Callable[[MarkdownIt], RendererProtocol] = RendererHTML,
4739
):
4840
"""Main parser class
4941
@@ -94,8 +86,8 @@ def set(self, options: MutableMapping) -> None:
9486
self.options = OptionsDict(options)
9587

9688
def configure(
97-
self, presets: Union[str, Mapping], options_update: Optional[Mapping] = None
98-
) -> "MarkdownIt":
89+
self, presets: str | Mapping, options_update: Mapping | None = None
90+
) -> MarkdownIt:
9991
"""Batch load of all options and component settings.
10092
This is an internal method, and you probably will not need it.
10193
But if you will - see available presets and data structure
@@ -131,7 +123,7 @@ def configure(
131123

132124
return self
133125

134-
def get_all_rules(self) -> Dict[str, List[str]]:
126+
def get_all_rules(self) -> dict[str, list[str]]:
135127
"""Return the names of all active rules."""
136128
rules = {
137129
chain: self[chain].ruler.get_all_rules()
@@ -140,7 +132,7 @@ def get_all_rules(self) -> Dict[str, List[str]]:
140132
rules["inline2"] = self.inline.ruler2.get_all_rules()
141133
return rules
142134

143-
def get_active_rules(self) -> Dict[str, List[str]]:
135+
def get_active_rules(self) -> dict[str, list[str]]:
144136
"""Return the names of all active rules."""
145137
rules = {
146138
chain: self[chain].ruler.get_active_rules()
@@ -150,8 +142,8 @@ def get_active_rules(self) -> Dict[str, List[str]]:
150142
return rules
151143

152144
def enable(
153-
self, names: Union[str, Iterable[str]], ignoreInvalid: bool = False
154-
) -> "MarkdownIt":
145+
self, names: str | Iterable[str], ignoreInvalid: bool = False
146+
) -> MarkdownIt:
155147
"""Enable list or rules. (chainable)
156148
157149
:param names: rule name or list of rule names to enable.
@@ -182,8 +174,8 @@ def enable(
182174
return self
183175

184176
def disable(
185-
self, names: Union[str, Iterable[str]], ignoreInvalid: bool = False
186-
) -> "MarkdownIt":
177+
self, names: str | Iterable[str], ignoreInvalid: bool = False
178+
) -> MarkdownIt:
187179
"""The same as [[MarkdownIt.enable]], but turn specified rules off. (chainable)
188180
189181
:param names: rule name or list of rule names to disable.
@@ -222,7 +214,7 @@ def add_render_rule(self, name: str, function: Callable, fmt: str = "html") -> N
222214
if self.renderer.__output__ == fmt:
223215
self.renderer.rules[name] = function.__get__(self.renderer) # type: ignore
224216

225-
def use(self, plugin: Callable, *params, **options) -> "MarkdownIt":
217+
def use(self, plugin: Callable, *params, **options) -> MarkdownIt:
226218
"""Load specified plugin with given params into current parser instance. (chainable)
227219
228220
It's just a sugar to call `plugin(md, params)` with curring.
@@ -237,7 +229,7 @@ def func(tokens, idx):
237229
plugin(self, *params, **options)
238230
return self
239231

240-
def parse(self, src: str, env: Optional[MutableMapping] = None) -> List[Token]:
232+
def parse(self, src: str, env: MutableMapping | None = None) -> list[Token]:
241233
"""Parse the source string to a token stream
242234
243235
:param src: source string
@@ -260,7 +252,7 @@ def parse(self, src: str, env: Optional[MutableMapping] = None) -> List[Token]:
260252
self.core.process(state)
261253
return state.tokens
262254

263-
def render(self, src: str, env: Optional[MutableMapping] = None) -> Any:
255+
def render(self, src: str, env: MutableMapping | None = None) -> Any:
264256
"""Render markdown string into html. It does all magic for you :).
265257
266258
:param src: source string
@@ -274,9 +266,7 @@ def render(self, src: str, env: Optional[MutableMapping] = None) -> Any:
274266
env = {} if env is None else env
275267
return self.renderer.render(self.parse(src, env), self.options, env)
276268

277-
def parseInline(
278-
self, src: str, env: Optional[MutableMapping] = None
279-
) -> List[Token]:
269+
def parseInline(self, src: str, env: MutableMapping | None = None) -> list[Token]:
280270
"""The same as [[MarkdownIt.parse]] but skip all block rules.
281271
282272
:param src: source string
@@ -296,7 +286,7 @@ def parseInline(
296286
self.core.process(state)
297287
return state.tokens
298288

299-
def renderInline(self, src: str, env: Optional[MutableMapping] = None) -> Any:
289+
def renderInline(self, src: str, env: MutableMapping | None = None) -> Any:
300290
"""Similar to [[MarkdownIt.render]] but for single paragraph content.
301291
302292
:param src: source string

markdown_it/parser_block.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Block-level tokenizer."""
2+
from __future__ import annotations
3+
24
import logging
3-
from typing import List, Optional, Tuple
45

56
from .ruler import Ruler
67
from .token import Token
@@ -10,7 +11,7 @@
1011
LOGGER = logging.getLogger(__name__)
1112

1213

13-
_rules: List[Tuple] = [
14+
_rules: list[tuple] = [
1415
# First 2 params - rule name & source. Secondary array - list of rules,
1516
# which can be terminated by this one.
1617
("table", rules_block.table, ["paragraph", "reference"]),
@@ -97,9 +98,9 @@ def parse(
9798
src: str,
9899
md,
99100
env,
100-
outTokens: List[Token],
101-
ords: Optional[Tuple[int, ...]] = None,
102-
) -> Optional[List[Token]]:
101+
outTokens: list[Token],
102+
ords: tuple[int, ...] | None = None,
103+
) -> list[Token] | None:
103104
"""Process input string and push block tokens into `outTokens`."""
104105
if not src:
105106
return None

markdown_it/parser_core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
* Top-level rules executor. Glues block/inline parsers and does intermediate
55
* transformations.
66
"""
7-
from typing import List, Tuple
7+
from __future__ import annotations
88

99
from .ruler import Ruler, RuleFunc
1010
from .rules_core.state_core import StateCore
1111
from .rules_core import normalize, block, inline, replace, smartquotes, linkify
1212

1313

14-
_rules: List[Tuple[str, RuleFunc]] = [
14+
_rules: list[tuple[str, RuleFunc]] = [
1515
("normalize", normalize),
1616
("block", block),
1717
("inline", inline),

markdown_it/parser_inline.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"""Tokenizes paragraph content.
22
"""
3-
from typing import List, Tuple
3+
from __future__ import annotations
44

55
from .ruler import Ruler, RuleFunc
66
from .token import Token
77
from .rules_inline.state_inline import StateInline
88
from . import rules_inline
99

1010
# Parser rules
11-
_rules: List[Tuple[str, RuleFunc]] = [
11+
_rules: list[tuple[str, RuleFunc]] = [
1212
("text", rules_inline.text),
1313
("newline", rules_inline.newline),
1414
("escape", rules_inline.escape),
@@ -22,7 +22,7 @@
2222
("entity", rules_inline.entity),
2323
]
2424

25-
_rules2: List[Tuple[str, RuleFunc]] = [
25+
_rules2: list[tuple[str, RuleFunc]] = [
2626
("balance_pairs", rules_inline.link_pairs),
2727
("strikethrough", rules_inline.strikethrough.postProcess),
2828
("emphasis", rules_inline.emphasis.postProcess),
@@ -114,7 +114,7 @@ def tokenize(self, state: StateInline) -> None:
114114
if state.pending:
115115
state.pushPending()
116116

117-
def parse(self, src: str, md, env, tokens: List[Token]) -> List[Token]:
117+
def parse(self, src: str, md, env, tokens: list[Token]) -> list[Token]:
118118
"""Process input string and push inline tokens into `tokens`"""
119119
state = StateInline(src, md, env, tokens)
120120
self.tokenize(state)

markdown_it/renderer.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@ class Renderer
55
copy of rules. Those can be rewritten with ease. Also, you can add new
66
rules if you create plugin and adds new token types.
77
"""
8+
from __future__ import annotations
9+
10+
from collections.abc import MutableMapping, Sequence
811
import inspect
9-
from typing import (
10-
Any,
11-
ClassVar,
12-
MutableMapping,
13-
Optional,
14-
Sequence,
15-
)
12+
from typing import Any, ClassVar
1613

1714
from .common.utils import unescapeAll, escapeHtml
1815
from .token import Token
@@ -191,7 +188,7 @@ def renderAttrs(token: Token) -> str:
191188

192189
def renderInlineAsText(
193190
self,
194-
tokens: Optional[Sequence[Token]],
191+
tokens: Sequence[Token] | None,
195192
options: OptionsDict,
196193
env: MutableMapping,
197194
) -> str:

0 commit comments

Comments
 (0)