Skip to content

Commit 8a058a8

Browse files
committed
refactor: treat mypy.stubtest as runtime test
1 parent 131bc83 commit 8a058a8

3 files changed

Lines changed: 147 additions & 279 deletions

File tree

pyproject.toml

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,10 @@ pass_env = [
296296
'CI',
297297
'TF_BUILD',
298298
]
299-
deps = [
300-
'lxml',
301-
]
302299
package = 'wheel'
303300
wheel_build_env = '{package_env}'
304301
dependency_groups = ['basic', 'stub-test']
305302
commands = [
306-
['python', '-m', 'mypy.stubtest', 'lxml', '--allowlist', 'tests/stubtest_allowlist.txt'],
307303
[
308304
'pytest',
309305
'--mypy-ini-file=tests/static/mypy-pytest.ini',
@@ -318,11 +314,18 @@ pass_env = [
318314
]
319315
package = 'wheel'
320316
wheel_build_env = '{package_env}'
321-
commands = [[
322-
'pytest',
323-
'--revealtype-mypy-config=tests/runtime/mypy.ini',
324-
{replace = 'posargs', default = ['tests/runtime'], extend = true}
325-
]]
317+
commands = [
318+
[
319+
'python', '-m', 'mypy.stubtest', 'lxml',
320+
'--ignore-unused-allowlist',
321+
'--allowlist', 'tests/runtime/allowlist.txt'
322+
],
323+
[
324+
'pytest',
325+
'--revealtype-mypy-config=tests/runtime/mypy.ini',
326+
{replace = 'posargs', default = ['tests/runtime'], extend = true}
327+
]
328+
]
326329

327330
[tool.tox._env_lxml49]
328331
dependency_groups = ['basic', 'rt-test', 'lxml49']

tests/runtime/allowlist.txt

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# Cython attributes
2+
lxml\.\w+\.\w+\.__copy__
3+
lxml\.\w+\.\w+\.__deepcopy__
4+
lxml\.\w+\.__pyx_capi__
5+
lxml\.\w+\.\w+\.__reduce_cython__
6+
lxml\.\w+\.\w+\.__setstate_cython__
7+
lxml\.\w+\.__test__
8+
9+
# Stub internal file structure
10+
lxml\._types
11+
lxml\.etree\._classlookup
12+
lxml\.etree\._cleanup
13+
lxml\.etree\._docloader
14+
lxml\.etree\._dtd
15+
lxml\.etree\._element
16+
lxml\.etree\._factory_func
17+
lxml\.etree\._iterparse
18+
lxml\.etree\._module_func
19+
lxml\.etree\._module_misc
20+
lxml\.etree\._nsclasses
21+
lxml\.etree\._parser
22+
lxml\.etree\._relaxng
23+
lxml\.etree\._saxparser
24+
lxml\.etree\._serializer
25+
lxml\.etree\._xinclude
26+
lxml\.etree\._xmlerror
27+
lxml\.etree\._xmlid
28+
lxml\.etree\._xmlschema
29+
lxml\.etree\._xpath
30+
lxml\.etree\._xslt
31+
lxml\.html\._element
32+
lxml\.html\._form
33+
lxml\.html\._funcs
34+
lxml\.html\._parse
35+
lxml\.objectify\._annotate
36+
lxml\.objectify\._element
37+
lxml\.objectify\._factory
38+
lxml\.objectify\._misc
39+
40+
# Stuff intentionally unimplemented in stub
41+
lxml\.ElementInclude\.default_loader
42+
lxml\.doctestcompare
43+
lxml\.etree\.PyErrorLog\.copy
44+
lxml\.etree\.Schematron
45+
lxml\.etree\.XMLTreeBuilder
46+
lxml\.etree\._BaseErrorLog\.copy
47+
lxml\.get_include
48+
lxml\.html\.ElementSoup
49+
lxml\.html\.formfill
50+
lxml\.html\.usedoctest
51+
lxml\.includes
52+
lxml\.includes\.extlibs
53+
lxml\.includes\.libexslt
54+
lxml\.includes\.libxml
55+
lxml\.includes\.libxslt
56+
lxml\.objectify\.NumberElement\.__\w+__
57+
lxml\.objectify\.LongElement
58+
lxml\.pyclasslookup
59+
lxml\.usedoctest
60+
61+
# Stuff _only_ implemented in stub
62+
lxml\.ElementInclude\.LoaderProtocol
63+
lxml\.etree\._ListErrorLog\.clear
64+
lxml\.etree\._Validator\.__call__
65+
lxml\.etree\._XPathEvaluatorBase\.__call__
66+
lxml\.etree\._XPathEvaluatorBase\.evaluate
67+
lxml\.etree\.ErrorTypes\.__getattr__
68+
lxml\.etree\.ParserTarget
69+
70+
# Stuff obsoleted or deprecated over time
71+
lxml\.etree\.HTMLParser\.setElementClassLookup
72+
lxml\.etree\.XMLParser\.setElementClassLookup
73+
lxml\.etree\.XSLT\.apply
74+
lxml\.html\.clean
75+
lxml\.html\.clean\..+
76+
77+
# Stuff only available in newer lxml
78+
lxml\.etree\.ICONV_COMPILED_VERSION
79+
lxml\.etree\.LIBXML_COMPILED_FEATURES
80+
lxml\.etree\.LIBXML_FEATURES
81+
82+
# Implementation intentionally differs
83+
lxml\.etree\._ErrorLog
84+
lxml\.etree\.__all__
85+
lxml\.html\.builder\.[A-Z0-9]+
86+
lxml\.html\.find_class
87+
lxml\.html\.find_rel_links
88+
lxml\.html\.iterlinks
89+
lxml\.html\.make_links_absolute
90+
lxml\.html\.resolve_base_href
91+
lxml\.html\.rewrite_links
92+
lxml\.objectify\.__all__
93+
94+
# Stub contains refined signature
95+
lxml\.etree\._Element\.xpath
96+
lxml\.etree\._ElementTree\.xpath
97+
lxml\.etree\._ElementTree\.xslt
98+
lxml\.etree\.SubElement
99+
lxml\.etree\.TreeBuilder\.[a-z]+
100+
lxml\.html\.HtmlElement\.cssselect
101+
lxml\.html\.tostring
102+
lxml\.objectify\.DataElement
103+
lxml\.objectify\.Element
104+
#lxml\.objectify\.ElementMaker\.__init__
105+
lxml\.objectify\.SubElement
106+
lxml\.objectify\.annotate
107+
108+
# Cython class __init__ clobbered by generic signature
109+
lxml\.builder\.ElementMaker\.__init__
110+
lxml\.etree\.ETCompatXMLParser\.__init__
111+
lxml\.etree\.HTMLParser\.__init__
112+
lxml\.etree\.TreeBuilder\.__init__
113+
lxml\.etree\.XInclude\.__init__
114+
lxml\.etree\.XMLParser\.__init__
115+
lxml\.etree\.XSLTAccessControl\.__init__
116+
lxml\.etree\._BaseErrorLog\.__init__
117+
lxml\.etree\.iterparse\.__init__
118+
lxml\.etree\.iterwalk\.__init__
119+
lxml\.objectify\.ElementMaker\.__init__
120+
121+
# Preload of lxml.html.defs when loading lxml.html
122+
# confuses mypy.stubtest
123+
lxml\.html\.__all__
124+
lxml\.html\.defs
125+
126+
# mypy.stubtest f*cked up in following cases
127+
lxml\.cssselect\.CSSSelector\.css
128+
lxml\.etree\._Attrib\.pop
129+
lxml\.etree\._ElementTree.write
130+
lxml\.etree\.strip_attributes
131+
lxml\.etree\.strip_elements
132+
lxml\.etree\.strip_tags
133+
lxml\.html\.soupparser\.fromstring
134+
lxml\.html\.soupparser\.parse
135+
lxml\.sax\.ElementTreeContentHandler\.__init__

0 commit comments

Comments
 (0)