Skip to content

Commit 82ccbbc

Browse files
authored
Re-export all public members for mypy (#119)
* Replace each import `x` in __init__.py with `x as x` * Run mypy on examples
1 parent 5337334 commit 82ccbbc

File tree

6 files changed

+94
-54
lines changed

6 files changed

+94
-54
lines changed

Diff for: examples/url.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
# This covers a typical URL schema, not the crazy one specified by https://tools.ietf.org/html/rfc3986
88
# In particular, this doesn't handle Unicode
99

10-
UserInfo = namedtuple("Userinfo", ["username", "password"])
10+
UserInfo = namedtuple("UserInfo", ["username", "password"])
1111
DomainName = namedtuple("DomainName", ["domains"])
12-
Url = namedtuple("Uri", ["scheme", "user_info", "host", "port", "path", "query", "fragment"])
12+
Url = namedtuple("Url", ["scheme", "user_info", "host", "port", "path", "query", "fragment"])
1313

1414

1515
class TypicalUrlParsers(ParserContext):
@@ -43,7 +43,7 @@ class TypicalUrlParsers(ParserContext):
4343
query_as_is = reg(r"[*-._A-Za-z0-9]+")
4444
query_space = lit("+") > constant(" ")
4545
query_string = rep1(query_as_is | query_space | encoded) > "".join
46-
query = repsep(query_string << "=" & query_string, "&") > OrderedDict
46+
query = repsep(query_string << "=" & query_string, "&") > OrderedDict # type: ignore
4747

4848
fragment = reg(r"[-._~/?A-Za-z0-9]*")
4949

Diff for: noxfile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def lint(s: Session, command: list[str]):
2828

2929
@session(venv_backend="none")
3030
def type_check(s: Session):
31-
s.run("mypy", "src")
31+
s.run("mypy", "src", "examples")
3232

3333

3434
@session(venv_backend="none")

Diff for: pyproject.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ extend-select = [
8383
# F821: undefined-name; Parsita triggers this, but code coverage will catch it
8484
# N805: invalid-first-argument-name-for-method; Parsita tests and examples define functions in class bodies
8585
extend-ignore = ["F821", "N805"]
86+
isort.combine-as-imports = true
8687

8788
[tool.ruff.lint.per-file-ignores]
8889
# F401: unused-import; Allow unused imports in __init__.py files
@@ -91,8 +92,8 @@ extend-ignore = ["F821", "N805"]
9192

9293
[tool.mypy]
9394
strict = true
94-
implicit_reexport = true
95-
95+
# name-defined; Parsita triggers this, but code coverage will catch it
96+
disable_error_code = ["name-defined"]
9697

9798
[build-system]
9899
requires = ["poetry-core>=1.0.0"]

Diff for: src/parsita/__init__.py

+31-26
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
1-
from .metaclasses import ParserContext, fwd
1+
# Use `as` to mark names as re-exports from submodules for mypy.
2+
# Remove this from all re-exports whenever mypy supports a less verbose solution
3+
# (https://github.com/python/mypy/issues/10198)
4+
# or Ruff adds adds an equivalent lint
5+
# (https://github.com/astral-sh/ruff/issues/13507)
6+
from .metaclasses import ParserContext as ParserContext, fwd as fwd
27
from .parsers import (
3-
Parser,
4-
any1,
5-
debug,
6-
eof,
7-
failure,
8-
first,
9-
lit,
10-
longest,
11-
opt,
12-
pred,
13-
reg,
14-
rep,
15-
rep1,
16-
rep1sep,
17-
repsep,
18-
success,
19-
until,
8+
Parser as Parser,
9+
any1 as any1,
10+
debug as debug,
11+
eof as eof,
12+
failure as failure,
13+
first as first,
14+
lit as lit,
15+
longest as longest,
16+
opt as opt,
17+
pred as pred,
18+
reg as reg,
19+
rep as rep,
20+
rep1 as rep1,
21+
rep1sep as rep1sep,
22+
repsep as repsep,
23+
success as success,
24+
until as until,
2025
)
2126
from .state import (
22-
Failure,
23-
ParseError,
24-
Reader,
25-
RecursionError,
26-
Result,
27-
SequenceReader,
28-
StringReader,
29-
Success,
27+
Failure as Failure,
28+
ParseError as ParseError,
29+
Reader as Reader,
30+
RecursionError as RecursionError,
31+
Result as Result,
32+
SequenceReader as SequenceReader,
33+
StringReader as StringReader,
34+
Success as Success,
3035
)

Diff for: src/parsita/parsers/__init__.py

+41-18
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,43 @@
1-
from ._alternative import FirstAlternativeParser, LongestAlternativeParser, first, longest
2-
from ._any import AnyParser, any1
3-
from ._base import Parser, wrap_literal
4-
from ._conversion import ConversionParser, TransformationParser
5-
from ._debug import DebugParser, debug
6-
from ._end_of_source import EndOfSourceParser, eof
7-
from ._literal import LiteralParser, lit
8-
from ._optional import OptionalParser, opt
9-
from ._predicate import PredicateParser, pred
10-
from ._regex import RegexParser, reg
11-
from ._repeated import RepeatedOnceParser, RepeatedParser, rep, rep1
1+
# Use `as` to mark names as re-exports from submodules for mypy.
2+
from ._alternative import (
3+
FirstAlternativeParser as FirstAlternativeParser,
4+
LongestAlternativeParser as LongestAlternativeParser,
5+
first as first,
6+
longest as longest,
7+
)
8+
from ._any import AnyParser as AnyParser, any1 as any1
9+
from ._base import Parser as Parser, wrap_literal as wrap_literal
10+
from ._conversion import (
11+
ConversionParser as ConversionParser,
12+
TransformationParser as TransformationParser,
13+
)
14+
from ._debug import DebugParser as DebugParser, debug as debug
15+
from ._end_of_source import EndOfSourceParser as EndOfSourceParser, eof as eof
16+
from ._literal import LiteralParser as LiteralParser, lit as lit
17+
from ._optional import OptionalParser as OptionalParser, opt as opt
18+
from ._predicate import PredicateParser as PredicateParser, pred as pred
19+
from ._regex import RegexParser as RegexParser, reg as reg
20+
from ._repeated import (
21+
RepeatedOnceParser as RepeatedOnceParser,
22+
RepeatedParser as RepeatedParser,
23+
rep as rep,
24+
rep1 as rep1,
25+
)
1226
from ._repeated_seperated import (
13-
RepeatedOnceSeparatedParser,
14-
RepeatedSeparatedParser,
15-
rep1sep,
16-
repsep,
27+
RepeatedOnceSeparatedParser as RepeatedOnceSeparatedParser,
28+
RepeatedSeparatedParser as RepeatedSeparatedParser,
29+
rep1sep as rep1sep,
30+
repsep as repsep,
31+
)
32+
from ._sequential import (
33+
DiscardLeftParser as DiscardLeftParser,
34+
DiscardRightParser as DiscardRightParser,
35+
SequentialParser as SequentialParser,
36+
)
37+
from ._success import (
38+
FailureParser as FailureParser,
39+
SuccessParser as SuccessParser,
40+
failure as failure,
41+
success as success,
1742
)
18-
from ._sequential import DiscardLeftParser, DiscardRightParser, SequentialParser
19-
from ._success import FailureParser, SuccessParser, failure, success
20-
from ._until import UntilParser, until
43+
from ._until import UntilParser as UntilParser, until as until

Diff for: src/parsita/state/__init__.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
1-
from ._exceptions import ParseError, RecursionError
2-
from ._reader import Reader, SequenceReader, StringReader
3-
from ._result import Failure, Result, Success
4-
from ._state import Continue, Element, Input, Output, State
1+
# Use `as` to mark names as re-exports from submodules for mypy.
2+
from ._exceptions import ParseError as ParseError, RecursionError as RecursionError
3+
from ._reader import (
4+
Reader as Reader,
5+
SequenceReader as SequenceReader,
6+
StringReader as StringReader,
7+
)
8+
from ._result import Failure as Failure, Result as Result, Success as Success
9+
from ._state import (
10+
Continue as Continue,
11+
Element as Element,
12+
Input as Input,
13+
Output as Output,
14+
State as State,
15+
)

0 commit comments

Comments
 (0)